我希望这个简单的文本字符串不会被视为匹配:
xyz@xyz:~$ echo xy | perl -n -e 'print if /y(?<!x)/'
xy
但奇怪的是。我也尝试了@ https://regex101.com/,结果是一样的。它似乎与y
匹配,这让我感到困惑。如果我的理解是正确的,那么上述正则表达式应仅匹配不前面有y
的{{1}}。
我使用Perl正则表达式。
由于
答案 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
或者,您需要考虑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/