跳轉到內容

正則表示式/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 匹配除“bat”以外所有由 .at 匹配的字串。
  • ^[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]”。

等價類,如排序符號,由語言環境定義。

[編輯 | 編輯原始碼]

在工具中的使用

[編輯 | 編輯原始碼]

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

華夏公益教科書