前言
日常开发中经常遇到需要对字符进行转义的场景,比如 Windows 系统和 Linux 系统中对于文件路径符的不同表示。通常,笔者为了赶进度基本靠试而没有真正理解,现在有时间了便好好整理一番。
Java中的转义符
Java中的字符串通常有三种表示方法:
- 直接单字符,例如“A”;
- 由转义字符表示的特殊字符,例如“\t”;
- Unicode字符,例如“\u0008”;
其中转义字符表示的字符串,显示出来的就是这种模式,例如“\t”与“ ”是同一个字符串,“abc\tefg”与”abc efg”是同一个字符串。其实第一、三两种方法大同小异,本文重点来说一下第二种方法。
通常Java中需要的转义的场景如下:
- 八进制转义序列:\ + 1到3位数字;范围’\000’~’\377’
\0:空字符 - Unicode转义字符:\u + 四个十六进制数字;0~65535
\u0000:空字符 - 特殊字符
\”:双引号
\’:单引号
\\:反斜线 - 控制字符
\r 回车
\n 换行
\f 走纸换页
\t 横向跳格
\b 退格
从上面可以看出,单独的“\”是不能出现在Java的字符串中作为字符串的,比如说如果要打印“abc\efg”,这时会报错:“错误:非法转义符”。这是因为系统把“\e“当做转义符,但是实际上并没有这个转义符。如果真的要将“\”作为一个符号打印输出,那么就应该在”\”前面再加一个“\”以表示后面的“\”是要被输出,例如打印输出“abc\efg”,这时终端就会显示“abc\efg”。
转义字符串在正则表达式中的应用
日常开发中,转义字符串在正则表达式中的应用主要体现在对字符串的处理上,而对字符串的处理无外乎如下三种情况:
- 对字符串的分割
一般而言,我们使用 String#split 方法对字符串进行分割操作,需要注意的是,参数regex是一个 regular-expression 的匹配模式而不是一个简单的String。 - 对字符串的替换
Java中的 String#replace 和 String#replaceAll 方法都能实现字符串的替换功能,但是两者有较大区别。
1,replace 的参数是char和CharSequence,即可以支持字符的替换,也支持字符串的替换(CharSequence即字符串序列的意思,说白了也就是字符串);
2,replaceAll 的参数是regex,即基于正则表达式的替换,比如:可以通过replaceAll(“\d”, “*”)把一个字符串所有的数字字符都换成星号;
此外,\ 在java中是一个转义字符,所以需要用两个代表一个,而 \ 也是正则表达式中的转义字符(replaceAll 的参数就是正则表达式),需要用两个代表一个,所以当我们使用 replaceAll 将 \ 替换成 \\ ,就要用 replaceAll (“\\”,”\\\\”)。