跳到內容

正則表示式/POSIX 擴充套件正則表示式

來自華夏公益教科書,開放的書籍,開放的世界

更高階的“擴充套件”正則表示式有時可以透過包含命令列標誌“-E”與 Unix 實用程式一起使用。其他 Unix 實用程式,如 awk,預設情況下使用它。

主要區別在於一些反斜槓被刪除:\{…\} 變成{…}以及 \(…\) 變成(…). 例子

  • "[hc]+at" 匹配 "hat", "cat", "hhat", "chat", "hcat", "ccchat" 等。
  • "[hc]?at" 匹配 "hat", "cat" 和 "at"
  • "([cC]at)|([dD]og)" 匹配 "cat", "Cat", "dog" 和 "Dog"

字元(,),[,],.,*,?,+,|,^$是特殊符號,必須用反斜槓符號進行轉義才能被視為字面字元。例如

"a\.(\(|\))" 匹配字串 "a.)" 或 "a.("

現代正則表示式工具允許將量詞指定為非貪婪的,方法是在量詞後面新增一個問號:(\[\[.*?\]\]).

元字元表

[編輯 | 編輯原始碼]

以下元字元被使用

元字元 描述
. 匹配任何單個字元(許多應用程式不包括換行符,以及哪些字元被認為是換行符是風格、字元編碼和平臺特定的,但可以安全地假設換行符包含在內)。在 POSIX 方括號表示式中,點字元匹配字面點。例如,a.c 匹配“abc”等,但 [a.c] 僅匹配“a”、“.”或“c”。
[ ] 方括號表示式。匹配方括號內包含的單個字元。例如,[abc] 匹配“a”、“b”或“c”。[a-z] 指定一個範圍,匹配從“a”到“z”的任何小寫字母。這些形式可以混合使用:[abcx-z] 匹配“a”、“b”、“c”、“x”、“y”或“z”,[a-cx-z] 也是如此。

- 字元被視為字面字元,如果它是方括號內最後一個或第一個(在 ^ 之後)字元:[abc-][-abc]。請注意,反斜槓轉義是不允許的。] 字元可以在方括號表示式中包含,如果它是第一個(在 ^ 之後)字元:[]abc].

[^ ] 匹配方括號內不包含的單個字元。例如,[^abc] 匹配除“a”、“b”或“c”以外的任何字元。[^a-z] 匹配任何不是從“a”到“z”的小寫字母的單個字元。如上所述,可以混合使用字面字元和範圍。
^ 匹配字串中的起始位置。線上性工具中,它匹配任何行的起始位置。
$ 匹配字串的結束位置或字串結尾換行符之前的那個位置。線上性工具中,它匹配任何行的結束位置。
BRE: \( \)
ERE: ( )
定義一個標記的子表示式。括號內匹配的字串可以在以後被呼叫(見下一項,\n)。標記的子表示式也稱為塊或捕獲組。
\n 匹配第 n 個標記的子表示式匹配的內容,其中 n 是從 1 到 9 的數字。這個結構在理論上是不規則的,並且沒有在 POSIX ERE 語法中採用。一些工具允許引用超過九個捕獲組。
* 匹配前面的元素零次或多次。例如,ab*c 匹配“ac”、“abc”、“abbbc”等。[xyz]* 匹配“”,"x","y","z","zx","zyx","xyzzy" 等等。\(ab\)*(在 BRE 中)或 (ab)*(在 ERE 中)匹配“”,"ab","abab","ababab" 等等。
BRE: \+
ERE: +
匹配前面的元素一次或多次。例如,ab\+c(在 BRE 中)或 ab+c(在 ERE 中)匹配“abc”、“abbbc”等,但不匹配“ac”,[xyz]\+(在 BRE 中)或 [xyz]+(在 ERE 中)匹配“x”、“y”、“z”、“zx”、“zyx”、“xyzzy” 等等。\(ab\)\+(在 BRE 中)或 (ab)+(在 ERE 中)匹配“ab”、“abab”、“ababab” 等等。
BRE: \?
ERE: ?
匹配前面的元素一次或零次。例如,ab\?c(在 BRE 中)或 ab?c(在 ERE 中)匹配“ac”或“abc”,而 \(ab\)\?(在 BRE 中)或 (ab)?(在 ERE 中)匹配"" 或 "ab"。
BRE: \|
ERE: |
匹配前面的元素或後面的元素。例如,abc\|def(在 BRE 中)或 abc|def(在 ERE 中)匹配“abc”或“def”。
BRE: \{m,n\}
ERE: {m,n}
匹配前面的元素至少 m 次,但不超過 n 次。例如,a\{3,5\}(在 BRE 中)或 a{3,5}(在 ERE 中)僅匹配“aaa”、“aaaa”和“aaaaa”。
BRE: \{m\}
ERE: {m}
匹配前面的元素正好 m 次。
BRE: \{m,\}
ERE: {m,}
匹配前面的元素至少 m 次。
BRE: \{,n\}
ERE: {,n}
匹配前面的元素不超過 n 次。例如,ba\{,2\}b(在 BRE 中)或 ba{,2}b(在 ERE 中)僅匹配“bb”、“bab”和“baab”。


字元類

[編輯 | 編輯原始碼]

POSIX 標準定義了一些字元類或類別,如以下表格所示

POSIX 類 類似於 含義
[:upper:] [A-Z] 大寫字母
[:lower:] [a-z] 小寫字母
[:alpha:] [[:upper:][:lower:]] 大寫和小寫字母
[:alnum:] [[:alpha:][:digit:]] 數字、大寫和小寫字母
[:digit:] [0-9] [0-9]
數字 [:xdigit:] [0-9A-Fa-f]
十六進位制數字 [:punct:] [.,!?:…]
標點符號 [:blank:] [ \t]
僅空格和製表符字元 [:space:] [ \t\n\r\f\v]
空白(空格)字元 [:cntrl:]
控制字元 [:graph:] [^\t\n\r\f\v]
印刷字元 [:print:] [^ \t\n\r\f\v]

印刷字元和空格

  • 連結
  • W:Regular_expression#Character_classes

始終支援的字元類 at boost.org

在工具中的使用

[編輯 | 編輯原始碼]

  • 使用這種正則表示式語法的工具和語言包括
AWK - 使用擴充套件正則表示式語法的超集
華夏公益教科書