正則表示式/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] 匹配除“a”、“b”或“c”以外的任何字元,而 [^a-z] 匹配任何不是從“a”到“z”的小寫字母的單個字元。這些形式可以混合使用:[^abcx-z] 匹配除“a”、“b”、“c”、“x”、“y”或“z”以外的任何字元。如果 |
^
|
如果它是正則表示式的第一個字元,則匹配字串內的起始位置。 |
$
|
如果它是正則表示式的最後一個字元,則匹配字串的結束位置。 |
*
|
匹配前面的元素零次或多次。例如,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]”。
等價類,就像排序符號一樣,是由區域設定定義的。
使用這種正則表示式語法的工具和語言包括