语言的转义字符及正则表达式的转义字符的表示
Java语言中的转义字符及正则语法中的转义字符在Java字符串中的表示。
ASCLL中的转义字符共有14个:
\o |
空字符(NULL) |
00H/0 |
\n |
换行符(LF) |
0AH/10 |
\r |
回车符(CR) |
0DH/13 |
\t |
水平制表符(HT) |
09H/9 |
\v |
垂直制表(VT) |
0B/11 |
\a |
响铃(BEL) |
07/7 |
\b |
退格符(BS) |
08H/8 |
\f |
换页符(FF) |
0CH/12 |
\’ |
单引号 |
27H/39 |
\” |
双引号 |
22H/34 |
\\ |
反斜杠 |
5CH/92 |
\? |
问号字符 |
3F/63 |
\ddd |
任意字符 |
三位八进制 |
\xhh |
任意字符 |
二位十六进制 |
在字符串或字符中只要出现反斜杠就 连同其后的一或多个字符 被认为是一个转义字符并尝试解析之,若不是合法的转义字符就会出错。在大多数语言中均如是,不过可能有些语言里不支持上述所有的转义字符。
语言对转义字符的处理:
在Java中支持的有11个: \0 \n \r \t \b \f \' \" \\ \ddd \xhh ,即在Java中与反斜杠搭配的只能有这11种情况,除此之外的都被认为是有误的。如 "\c" 或 '\c' 都会报错,即使我们本意不是想把前者中的 \c 当做转义字符而是想表示 \ 和 c 这两个字符,但由于语言看到了斜杠就会按转义字符去解析,所以对于前后者都会因解析不成转义字符而报错。故若想表示这两个字符而不报错,就要加以处理以让语言不把它们当做转义字符解析,方法是对斜杠转义(让语言把斜杠当做普通字符而非转义字符的开始)——即 “\\c" 。
正则表达式的字符串表示:(在Java中用字符串表示正则表达式时很常出现上述情况)
在Java中没有什么特殊的语法能直接表示正则表达式,需要用字符串表示之(即在字符串里依次表示正则表达式里的每个字符),JavaScript则好像可以直接表示?
在正则语法中有几个元字符( . $ | ( ) [ { ^ ? * + \ )有特殊含义(如 * 在正则表达式中表示匹配0或多个),根据正则语法若要将这些字符当做普通字符而非元字符来对待则需要加斜杠转义(如当我们想匹配该字符本身,则应该在模式定义中对之转义即 \* ),显然用字符串表示这些元字符的转义字符时(如 "\*")会因为解析不成ASCLL转义字符而报错,解决方法如上所述改为 "\\*" 。一个更极端的例子:在字符串中 \ 是元字符,为了在字符串中表示正则表达式的 \ 就需要两个斜杠即 \\ ;而正则表达式中 \ 也是元字符,为了要匹配 \ 自身,根据正则语法需转义为 \\ ,此时字符串表示就需要四个斜杠即 \\\\ 。
正则表达式中可能出现三种转义字符:预定义的一些正则表达式如表示数字的 \d 表示字符 \w 等、正则语法的元字符当普通字符对待时转义字符(特殊转普通)、ASCLL中的转义字符(普通转特殊)。
总结(正则表达式的字符串形式):根据正则语法定义正则表达式,然后将表达式转为字符串表示:一个简单的规则是正则表达式中的任何一个'\',在字符串中,需要替换为两个'\',(对于ASCLL转义字符反斜杠替不替换均可)。更简单的方式是在IDE(如Eclipse)中将定义好的正则表达式复制到String类型变量的值中,会自动添加 '\' 。