Regular-Expression

FreeBSD 是否包含基本正則表達式的多種變體?

  • November 5, 2019

grep並且sed預設情況下都被描述為使用“基本正則表達式”(“BRE”)。BRE在這裡有很好的描述。

但是考慮這個輸出:

# echo '    aaaaa   ' | grep '\(aaaaa\|bbbbb\)'
   aaaaa
# echo '    aaaaa   ' | sed '/\(aaaaa\|bbbbb\)/ s/ /_/g'
   aaaaa

在第一個命令中,\( ... \| ... \)語法顯然是(X OR Y)因為輸出通過了grep

在第二個命令中,\( ... \| ... \)語法顯然沒有充當(X OR Y)因為空格沒有更改為下劃線。

(相比之下,兩個命令都被辨識\+為“一個或多個重複”)

發生了什麼事?為什麼在 FreeBSD 中似乎有兩種 BRE,其中一種可以辨識另一種不能辨識的語法?

更深層次的問題是,許多項目著眼於 BRE 以提供對其他類 unix 系統的可移植性。但這表明即使 BRE 在各個平台之間也不可能相同,即使它們各個平台中都不相同。啊?

連結文章中的描述是錯誤的。

實際的 POSIX 定義指出:

以非轉義 <反斜杠> ( ‘' ) 開頭的普通字元的解釋是未定義的,除了*[ (){}、數字和括號表達式]*

普通字元被定義為除 BRE 特殊字元.[^$*和反斜杠本身之外的任何字元。

因此,與該頁面聲稱的不同,\+BRE 中未定義 ,\|.

一些正則表達式實現將它們定義為與 ERE 相同+|但尤其是 GNU 的。但是您不應該指望這一點,而是堅持定義的功能。

當然,這裡的問題是|BRE 中根本不存在 ERE 交替運算符,而 ERE 的等價物+非常醜陋(它是\{1,\})。因此,您可能想改用 ERE。

引用自:https://unix.stackexchange.com/questions/550452