Text-Processing

為什麼正則表達式中的 ^s$ 不匹配“以 s 開頭並以 s 結尾”之類的字元串?

  • September 15, 2021

如果^匹配一行的開頭和一行$的結尾,那麼為什麼不匹配標題中的字元串^$的開頭和結尾?

你如何製作這樣一個匹配這樣的字元串的正則表達式:

“以 開頭s和結尾s。”

原因在於處理 RegEx 匹配的方式(參見此處,例如):字元串是從左到右計算的,並且 - 除了反向引用 - 字元串中的每個符號都必須與正則表達式中的標記匹配(其中在最簡單的情況下是文字元號本身),儘管由於重複運算符,令牌可以是隱式的。

關鍵是正則表達式不是描述“整個字元串的一般屬性”(比如“以”開頭和結尾),而是在字元串的字元級別s強加規則。所以,你的正則表達式

^s$

表示:“字元串開頭”,後跟一個 s,然後緊跟“字元串結尾”。因此,這只會匹配由單個字母組成的字元串s。雖然從技術上講,這是一個以 開頭和結尾的字元串s,但它不是您要查找的內容。

如果要匹配以 開頭、中間s有任意字元並以 結尾的字元串,則s必須明確指定所有這些字元。

為了使其非常明確:

  • 第一次迭代可能如下所示:
^s.*s$

這將匹配“以 開頭的字元串s,後跟零個或多個任意類型 ( .*) 的字元,然後是s字元串的結尾。

  • 當然,這不會匹配包含字元的字元串s。因此,在第二次迭代中,我們將在初始s可選部分之後製作部分(參見@user414777 的評論):
^s(.*s)?$

然後,這將匹配“以 開頭的字元串s,後跟零次或一次 (the ?) ‘零個或多個任意類型字元的子字元串,後跟一個s’(the 的內容(...)),然後立即結束”。

現在,當您使用 標記您的問題時awk,這可能意味著您想要為awk僅在行或字元串以 開頭和結尾時適用的規則創建條件s。這可能看起來像:

awk '/^s/ && /s$/ { ... }'

使用grep,這樣的AND構造在本機是不可能的(語法相當於OR),但您可以通過管道實現它:-e *regex1* -e *regex2*

grep "^s" sourcefile.txt | grep "s$"

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