2017-05-09 28 views
4

我希望這個簡單的文本字符串不會被視爲匹配:爲什麼這個負面後視被認爲是成功的正則表達式匹配?

[email protected]:~$ echo xy | perl -n -e 'print if /y(?<!x)/' 
xy 

但奇怪的是它。我試過了@https://regex101.com/,結果是一樣的。它似乎會匹配y,這讓我感到困惑。如果我的理解是正確的,上述正則表達式應該只匹配y S中的冠以一個x

PS:我這就給了一個簡單的例子。一般來說,我想使用負面lookbehinds來匹配完整的字符串,而不一定是單個字符,如x。

我使用Perl的正則表達式的味道。

感謝

回答

5

你有負回顧斷言的向後位置。

它是零寬度,所以必須在y面前,你寫它。

考慮:

$ echo $'xy\nay\nyx' 
xy 
ay 
yx 

的回顧後/y(?<!x)/比賽前或在y回來x線,因爲y是斷言(不x)背後:

$ echo $'xy\nay\nyx' | perl -n -e 'print if /y(?<!x)/' 
xy 
ay 
yx 

注意yx也匹配因爲斷言在x之前,並且看着y因此所有三條線都是匹配的。

Vs的你正在尋找:

$ echo $'xy\nay\nyx' | perl -n -e 'print if /(?<!x)y/' 
ay 
yx 

Demo

Further explanation.

或者,你需要考慮的y的寬度(或任何與之匹配的是),如果看

:在 y通過在斷言 y後向後
$ echo $'xy\nay\nyx' | perl -n -e 'print if /y(?<!xy)/' 
ay 
yx 
+0

你這樣做是正確的耶。 a'it。 –

5

ab表示a後面跟着b。因此,您正在一個位置檢查y,然後檢查下一個位置是否先於x。 它不是由x —之前它是由y —開頭,這樣的模式相匹配。

你想

/(?<!x)y/ 

/(?:^|[^x])y/ 
相關問題