BRE與ERE的異同
POSIX有兩種風格的Regex:基本Regex(BRE)與擴充Regex(ERE)。
下面,來討論一下這兩種Regex之間的異同。
meta字元
相同之處:
\ 用以關閉後續字元的特殊含義
. 匹配任何的單個字元,NUL除外
* 匹配在它之前的任何數目的單個字元
# 匹配緊接著的Regex,在行或字串的起始處
$ 匹配前面的Regex,在行或字串的結尾處
[…] 匹配括弧內的任一字元
相異之處:
\{n,m\} BRE 區間運算式,匹配在它前面的單個字元重現的次數區間
{n,m} ERE 區間運算式,匹配在它前面的單個字元重現的次數區間
\( \) BRE 表示子模式,可通過逸出序列來引用(例如\1)
( ) ERE 匹配與括起來的Regex
\n BRE 重複在\(與\)括弧內的第n個子模式。n為1至9的數字。
+ ERE 匹配前面Regex的一個或多個執行個體
? ERE 匹配前面Regex的零個或一個執行個體
| ERE 匹配於|符號前或後的Regex
^與$僅在BRE的起始與結尾處具有特殊用途。在BRE下,ab^cd裡的^表示的,就是自身的^,並不是meta字元;同樣,ef$gh裡的$在這裡表示的也就是字面上的貨幣符號。然後在ERE裡,^與$永遠是meta字元。所以,像ab^cd與ef$fg這樣的Regex仍是有效,只是無法匹配到任何東西。
運算子優先順序
相異之處:
BRE的運算子優先順序(由高至低遞減)
[..] [==] [::] 用於字元排序的方括弧符號
\metacharacter 轉義的meta字元
[] 方括號運算式
\( \) \digit 子運算式與後向引用
* \{ \} 前置單個字元重現的Regex
無符號 連續
^ $ 錨點
ERE的運算子優先順序(由高至低遞減)
[..] [==] [::] 用於字元排序的方括弧符號
\metacharacter 轉義的meta字元
[] 方括號運算式
() 分組
* + ? {} 重複前置的Regex
無符號 連續
^ $ 錨點
| 交替