3 回答

TA貢獻1844條經驗 獲得超8個贊
因為這是一個常見的常見問題解答,所以讓我列出一些Bash不支持的結構,以及如何解決它們,這里有一個簡單的解決方法。
正則表達式有多種常用方言。Bash支持的是擴展正則表達式的變體。例如,這不同于許多在線正則表達式測試器支持的功能,后者通常是更現代的Perl 5 / PCRE變體。
擊不支持
\d
\D
\s
\S
\w
\W
-這些可以與POSIX字符類等同替換[[:digit:]]
,[^[:digit:]]
,[[:space:]]
,[^[:space:]]
,[_[:alnum:]]
,和[^_[:alnum:]]
,分別。(請注意最后一種情況,其中[:alnum:]
POSIX字符類使用下劃線增強,以完全等同于Perl的\w
速記形式。)Bash不支持非貪婪匹配。有時您可以
a.*?b
用類似的東西代替,a[^ab]*b
以在實踐中獲得類似的效果,盡管兩者并不完全相同。Bash不支持非括號
(?:...)
。在平凡的情況下,只需使用捕獲括號即可(...)
;當然,如果您使用捕獲組和/或反向引用,則會重新編號捕獲組。擊不支持lookarounds像
(?<=before)
或者(?!after)
,事實上任何與(?
是一個Perl擴展。盡管您經常可以將問題改寫為可以避免環顧的問題,但沒有簡單的常規解決方法。

TA貢獻1890條經驗 獲得超9個贊
從 man bash
可以使用附加的二進制運算符=?,其優先級與==和!=相同。使用它時,運算符右邊的字符串將被視為 擴展的正則表達式并進行相應的匹配(如regex(3)中一樣)。
ERE不支持先行/后退。但是,您的代碼((?!Disk))中有它們。
這就是為什么您的正則表達式不符合您預期的原因。
- 3 回答
- 0 關注
- 506 瀏覽
添加回答
舉報