《正則表達式經典實例(第2版)》——2.2 匹配不可打印字符
本節書摘來自異步社區《正則表達式經典實例(第2版)》一書中的第2章,第2.2節,作者: 【美】Jan Goyvaerts , Steven Levithan著,更多章節內容可以訪問雲棲社區“異步社區”公眾號查看
2.2 匹配不可打印字符
問題描述
匹配一個包含下列ASCII控製字符的字符串:振鈴符(bell)、轉義符(escape)、換頁符(form feed)、換行符(line feed)、回車符(carriage return)、水平製表符(horizontal tab)和垂直製表符(vertical tab)。這些字符的十六進製ASCII編碼分別是07、1B、0C、0A、0D、09、0B。
下麵演示了轉義序列的用法,以及如何以十六進製編碼代表字符。
解決方案
\a\e\f\n\r\t\v
正則選項:無
正則流派:.NET、Java、PCRE、Python、Ruby
\x07\x1B\f\n\r\t\v
正則選項:無
正則流派:.NET、Java、JavaScript、Python、Ruby
\a\e\f\n\r\t\x0B
正則選項:無
正則流派:.NET、Java、PCRE、Perl、Python、Ruby
討論
這7個最常用的ASCII控製字符擁有專門的轉義序列。它們都包含一個反斜杠與一個字母。這與在許多編程語言中用於字符串字麵文本的語法是相同的。表2-1給出了常用的不可打印字符以及它們的表示方法。
在Perl 5.10及以後版本和PCRE 7.2及以後版本中,‹\v›的確匹配垂直製表符。不過在這些流派中‹\v›實際上匹配所有垂直空白,包括垂直製表符、換行符以及Unicode行和段落分隔符。因此,對於Perl和PCRE需要使用其他字符表示垂直製表符。
JavsScript不支持‹\a›和‹\e›。我們需要其他的辦法。這些控製字符以及在下麵的小節中會給出的替代語法,均可以在正則表達式中的字符組之內和之外同等地使用。
不可打印字符的變體表示
26個控製字符
下邊是與本例先前相同的7個ASCII控製字符的另一種匹配方法:
\cG\x1B\cL\cJ\cM\cI\cK
正則選項:無
正則流派:.NET、Java、JavaScript、PCRE、Perl、Ruby 1.9
使用從‹\cA›到‹\cZ›,可以匹配在ASCII表中占據了第1~26位的26個控製字符。其中的c必須是小寫的。在大多數流派中,c之後的字母是不區分大小寫的。我們推薦始終使用大寫字母,因為Java這樣要求。
如果你已經習慣在終端係統上通過按Ctrl鍵加上一個字符來輸入控製符號的話,這種語法會比較容易。在終端上,Ctrl+H會發送一個回車。而在正則表達式中,‹\cH›會匹配一個回車。
Python和Ruby 1.8中的經典Ruby引擎並不支持這種語法。而Ruby 1.9中的Oniguruma引擎則支持這種語法。
在ASCII表中第27位的轉義控製字符就超出了英語字母表的範圍,因此我們會在正則表達式中使用‹\x1B›來表示它。
7位字符集
下麵是另一種匹配我們列出的這7個常見控製字符的方法:
\x07\x1B\x0C\x0A\x0D\x09\x0B
正則選項:無
正則流派:.NET、Java、JavaScript、PCRE、Perl、Python、Ruby
一個小寫的\x後跟兩個大寫十六進製數字可以匹配ASCII字符集中的一個字符。圖2-1給出了在完整ASCII字符集中從‹\x00›到‹\x7F›組合所匹配的每個字符。在該圖中,第一個十六進製數字從左邊向下排列,而第二個數字則在第一行從左向右排列。
從‹\x80›到‹\xFF›會匹配哪些字符則要取決於你的正則引擎會如何解釋它們,以及你的目標文本使用哪種代碼頁編碼。我們推薦你不要使用‹\x80›到‹\xFF›。作為替代,應該使用在實例2.7中描述的Unicode碼位記號。
如果使用的是Ruby 1.8,或者在編譯PCRE時沒有使用UTF-8支持,就不能使用Unicode碼位。Ruby 1.8和不帶UTF-8的PCRE是8位的正則引擎。它們對於文本編碼和多字節字符是完全不支持的。在這些引擎中,‹\xAA›隻會簡單地匹配字節0xAA,而不去管0xAA所表示的是哪個字符,或者0xAA是否屬於某個多字節字符的一部分。
最後更新:2017-06-06 07:35:16