2017-05-09 27 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/ 
相关问题