为什么这种负面的背后被认为是成功的正则表达式匹配?

时间:2017-05-09 03:22:20

标签: regex perl negative-lookbehind

我希望这个简单的文本字符串不会被视为匹配:

xyz@xyz:~$ echo xy | perl -n -e 'print if /y(?<!x)/'
xy

但奇怪的是。我也尝试了@ https://regex101.com/,结果是一样的。它似乎与y匹配,这让我感到困惑。如果我的理解是正确的,那么上述正则表达式应仅匹配前面有y的{​​{1}}。

PS:我给出了一个简单的例子。一般来说,我想使用负面的lookbehinds来匹配完整的字符串,而不一定是像x这样的单个字符。

我使用Perl正则表达式。

由于

2 个答案:

答案 0 :(得分:5)

你有负面回顾断言的位置。

它是零宽度,所以需要在y之前,就像你写的一样。

假设:

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

lookbehind /y(?<!x)/x前面或后面的y行匹配,因为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

答案 1 :(得分:5)

ab表示a后跟b。因此,您在一个位置检查y,然后检查下一个位置是否在x之前。 它前面没有x -it,前面有y - 所以模式匹配。

你想要

/(?<!x)y/

/(?:^|[^x])y/