本文摘要翻譯了幾篇文章的内容,簡單介紹 ATL CAtlRegExp,GRETA,Boost::regex 等正規表達式庫,這些表達式庫使我們可以友善地利用正則庫的巨大威力,給我們的工作提供了便利。
- 正規表達式文法
字元元 | 意義 |
. | 比對單個字元 |
[ ] | 指定一個字元類,比對方括号内的任意字元。例:[abc] 比對 "a", "b"或 "c"。 如果要比對方括号,則使用 "(\\[)" 或 [\\]] |
^ | 如果^出現在字元類的開始處,它否定了字元類,這個被否定的字元類比對除卻方括号内的字元的字元。如:[^abc]比對除了"a", "b"和"c"之外的字元。如果^出現在正規表達式前邊,它比對輸入的開頭,例:^[abc]比對以"a", "b"或"c"開頭的輸入。 |
- | 在字元類中,指定一個字元的範圍。例如:[0-9]比對"0"到"9"的數字。 |
? | 指明?前的表達式是可選的,它可以比對一次或不進行比對。例如: [0-9][0-9]? 比對"2"或"12"。 |
+ | 指明?前的表達式比對一次或多次。例如:[0-9]+比對"1", "13", "666"等。 |
* | 指明*前的表達式比對零次或多次。 |
??, +?, *? | ?, +和*的非貪婪比對版本,它們盡可能比對較少的字元;而?, +和*則是貪婪版本,盡可能比對較多的字元。例如:輸入"<abc><def>", 則<.*?> 比對"<abc>",而<.*>比對"<abc><def>"。 |
( ) | 分組操作符。例如:(\d+,)*\d+比對一串由逗号分開的數字,例如: "1"或"1,23,456"。 |
\ | 轉義字元,轉義緊跟的字元。例如,[0-9]+ 比對一個或多個數字,而 [0-9]\+ 比對一個數字後跟随一個加号的情況。反斜杠\也用于表示縮寫,\a 就表示任何數字、字母。如果\後緊跟一個數字n,則它比對第n個比對群組(從0開始),例如,<{.*?}>.*?</\0>比對"<head>Contents</head>"。注意,在C++字元串中,反斜杠\需要用雙反斜杠\\來表示: "\\+", "\\a", "<{.*?}>.*?</\\0>"。 |
$ | 放在正規表達式的最後,它比對輸入的末端。例如:[0-9]$比對輸入的最後一個數字。 |
| | 間隔符,分隔兩個表達式,以正确比對其中一個,例如:T|the比對"The" 或"the"。 |
2。 縮寫比對
縮寫 | 比對 |
\a | 字母、數字([a-zA-Z0-9]) |
\b | 空格(blank): ([ \\t]),另一說為 比對單詞的開始或結束 |
\c | 字母([a-zA-Z]) |
\d | 十進制數 ([0-9]) |
\h | 十六進制數([0-9a-fA-F]) |
\n | 換行: (\r|(\r?\n)) |
\q | 引用字元串(\"[^\"]*\")|(\''''[^\'''']*\'''') |
\w | 一段文字 ([a-zA-Z]+) |
\z | 一個整數([0-9]+) |
\s | 比對任意的空白符 |
比對字元串的開始 |
比對字元串的結束 | |
比對除換行符以外的任意字元 |
3.常用的重複限定符
代碼/文法 | 說明 |
---|---|
重複零次或更多次 | |
重複一次或更多次 | |
重複零次或一次 | |
{n} | 重複n次 |
{n,} | 重複n次或更多次 |
{n,m} | 重複n到m次 |
可以用小括号來指定子表達式(也叫做分組),
4。 命名捕獲組+平衡組
你也可以自己指定子表達式的組名。要指定一個子表達式的組名,請使用這樣的文法:(?<Word>\w+)(或者把尖括号換成'也行:(?'Word'\w+)),這樣就把\w+ 這部分正則式(zcl:比對一行的第一個單詞)的組名指定為Word了。要反向引用這個分組捕獲的内容,你可以使用\k<Word>,
- (?'group') 把捕獲的内容命名為group,并壓入堆棧(Stack)
- (?'-group') 從堆棧上彈出最後壓入堆棧的名為group的捕獲内容,如果堆棧本來為空,則本分組的比對失敗
- (?(group)yes|no) 如果堆棧上存在以名為group的捕獲内容的話,繼續比對yes部分的表達式,否則繼續比對no部分
- (?!) 零寬負向先行斷言,由于沒有字尾表達式,試圖比對總是失敗
- [.?!]比對标點符号(.或?或!)。
(?!exp) 比對後面跟的不是exp的位置
表4.常用分組文法
分類 代碼/文法 說明
捕獲 (exp) 比對exp,并捕獲文本到自動命名的組裡
(?<name>exp) 比對exp,并捕獲文本到名稱為name的組裡,也可以寫成(?'name'exp)
(?:exp) 比對exp,不捕獲比對的文本,也不給此分組配置設定組号
零寬斷言 (?=exp) 比對exp前面的位置
(?<=exp) 比對exp後面的位置
(?!exp) 比對後面跟的不是exp的位置
(?<!exp) 比對前面不是exp的位置
注釋 (?#comment) 這種類型的分組不對正規表達式的處理産生任何影響,用于提供注釋讓人閱讀