閱讀169 返回首頁    go 阿裏雲 go 技術社區[雲棲]


《正則表達式經典實例(第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給出了常用的不可打印字符以及它們的表示方法。
screenshot

在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›組合所匹配的每個字符。在該圖中,第一個十六進製數字從左邊向下排列,而第二個數字則在第一行從左向右排列。

screenshot


從‹\x80›到‹\xFF›會匹配哪些字符則要取決於你的正則引擎會如何解釋它們,以及你的目標文本使用哪種代碼頁編碼。我們推薦你不要使用‹\x80›到‹\xFF›。作為替代,應該使用在實例2.7中描述的Unicode碼位記號。

screenshot如果使用的是Ruby 1.8,或者在編譯PCRE時沒有使用UTF-8支持,就不能使用Unicode碼位。Ruby 1.8和不帶UTF-8的PCRE是8位的正則引擎。它們對於文本編碼和多字節字符是完全不支持的。在這些引擎中,‹\xAA›隻會簡單地匹配字節0xAA,而不去管0xAA所表示的是哪個字符,或者0xAA是否屬於某個多字節字符的一部分。

最後更新:2017-06-06 07:35:16

  上一篇:go  《正則表達式經典實例(第2版)》——2.3 匹配多個字符之一
  下一篇:go  《正則表達式經典實例(第2版)》——第 2 章 正則表達式的基本技能 2.1匹配字麵文本