Text-Processing
為什麼正則表達式中的 ^s$ 不匹配“以 s 開頭並以 s 結尾”之類的字元串?
如果
^
匹配一行的開頭和一行$
的結尾,那麼為什麼不匹配標題中的字元串^$
的開頭和結尾?你如何製作這樣一個匹配這樣的字元串的正則表達式:
“以 開頭
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$"