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類型變量的值中,會自動添加 '\' 。