前言

日常开发中经常遇到需要对字符进行转义的场景,比如 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 (“\\”,”\\\\”)。