跳轉到內容

正則表示式/POSIX 基本正則表示式

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

POSIX 基本正則表示式 (BRE) 語法提供了擴充套件,以實現 grep、sed 和 awk 等實用程式之間的相容性。這些擴充套件不受某些傳統 Unix 工具實現的 支援。

傳統的 Unix 正則表示式語法遵循常見的約定,這些約定通常因工具而異。POSIX 基本正則表示式語法由 IEEE 發展而來,並與稱為 擴充套件正則表示式 語法的擴充套件變體一起發展。這些標準的設計主要為了提供對傳統 簡單正則表示式 語法的向後相容性,提供一個通用標準,該標準後來被採用為許多 Unix 正則表示式工具的預設語法。

在 POSIX 基本正則表示式語法中,大多數字符被視為字面量 - 它們僅匹配自身(例如,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”的小寫字母的單個字元。這些形式可以混合使用:[^abcx-z] 匹配除“a”、“b”、“c”、“x”、“y”或“z”以外的任何字元。

如果 - 字元是最後一個字元或 ^ 後的第一個字元,則它被視為字面量字元:[^abc-][^-abc]。如果 ] 字元是 ^ 後的第一個字元,則它被視為字面量字元:[^]abc]。表示式也可以包含 字元類等價類排序字元

^ 如果它是正則表示式的第一個字元,則匹配字串內的起始位置。
$ 如果它是正則表示式的最後一個字元,則匹配字串的結束位置。
* 匹配前面的元素零次或多次。例如,ab*c 匹配“ac”、“abc”、“abbbc”等。[xyz]* 匹配“”, “x”、“y”、“z”、“zx”、“zyx”、“xyzzy”等等。
BRE: \{m\}
ERE: {m}
匹配前面的元素恰好 m 次。例如,a\{3\} 僅匹配“aaa”。
BRE: \{m,\}
ERE: {m,}
匹配前面的元素至少 m 次。例如,a\{3,\} 匹配“aaa”、“aaaa”、“aaaaa”、“aaaaaa”、“aaaaaaa”等等。
BRE: \{m,n\}
ERE: {m,n}
匹配前面的元素至少 m 次,但不超過 n 次。例如,a\{3,5\} 僅匹配“aaa”、“aaaa”和“aaaaa”。這在一些較舊的正則表示式例項中找不到。
BRE: \( \)
ERE: ( )
定義一個子表示式。它被視為單個元素。例如,ab* 匹配“a”、“ab”、“abb”等等,而 \(ab\)* 匹配“”, “ab”、“abab”、“ababab”等等。括號內匹配的字串可以在以後被召回(參見下一項,\n)。子表示式也稱為標記子表示式、塊或捕獲組。
BRE 僅限:\n 匹配第 n 個標記子表示式匹配的內容,其中 n 是從 1 到 9 的數字。此結構在理論上是不規則的(具有此結構的表示式不符合正則表示式的數學定義),並且未被採用在 POSIX ERE 語法中。

示例

  • .at 匹配以“at”結尾的任何三個字元字串,包括“hat”、“cat”和“bat”。
  • [hc]at 匹配“hat”和“cat”。
  • [^b]at 匹配由 .at 匹配的所有字串,除了“bat”。
  • ^[hc]at 匹配“hat”和“cat”,但僅匹配字串或行的開頭。
  • [hc]at$ 匹配“hat”和“cat”,但僅匹配字串或行的結尾。
  • \[.\] 匹配任何被 "[" 和 "]" 包圍的單個字元,因為括號被轉義,例如:“[a]”和“[b]”。

字元類

[編輯 | 編輯原始碼]

POSIX 標準定義了一些字元類或類別,如下所示。這些類在方括號內使用。

POSIX 類 類似於 含義
[:upper:] [A-Z] 大寫字母
[:lower:] [a-z] 小寫字母
[:alpha:] [A-Za-z] 大寫和小寫字母
[:digit:] [0-9] 數字
[:xdigit:] [0-9A-Fa-f] 十六進位制數字
[:alnum:] [A-Za-z0-9] 數字、大寫和小寫字母
[:punct:] 標點符號(除字母和數字之外的所有圖形字元)
[:blank:] [ \t] 僅空格和製表符字元
[:space:] [ \t\n\r\f\v] 空格(空白)字元
[:cntrl:] 控制字元
[:graph:] [^ [:cntrl:]] 圖形字元(所有具有圖形表示的字元)
[:print:] [[:graph:] ] 圖形字元和空格

例如,

  • a[[:digit:]]b 匹配“a0b”、“a1b”……“a9b”。
  • a[:digit:]b 是錯誤的:字元類必須在方括號內
  • [[:digit:]abc] 匹配任何數字、“a”、“b”和“c”。
  • [abc[:digit:]] 與上面相同
  • [^ABZ[:lower:]] 匹配除小寫字母、A、B 和 Z 之外的任何字元。

排序符號

[編輯 | 編輯原始碼]

排序符號,與字元類類似,在方括號內使用,形式為 [.ch.]。這裡 ch 是一個二合字。排序系統由區域設定定義。

等價類

[編輯 | 編輯原始碼]

等價類,與字元類和排序符號類似,在方括號內使用,形式為 [=a=]。它們代表與給定字元等價的任何字元。根據標準[1]

例如,如果“a”、“à”和“â”屬於同一個等價類,那麼“[[=a=]b]”、“[[=à=]b]”和“[[=â=]b]”都等價於“[aàâb]”。

等價類,就像排序符號一樣,是由區域設定定義的。

[編輯 | 編輯原始碼]

工具中的使用

[編輯 | 編輯原始碼]

使用這種正則表示式語法的工具和語言包括

華夏公益教科書