为什么这个负面后视被认为是成功的正则表达式匹配?
问题描述:
我希望这个简单的文本字符串不会被视为匹配:为什么这个负面后视被认为是成功的正则表达式匹配?
[email protected]:~$ echo xy | perl -n -e 'print if /y(?<!x)/'
xy
但奇怪的是它。我试过了@https://regex101.com/,结果是一样的。它似乎会匹配y
,这让我感到困惑。如果我的理解是正确的,上述正则表达式应该只匹配y
S中的不冠以一个x
。
PS:我这就给了一个简单的例子。一般来说,我想使用负面lookbehinds来匹配完整的字符串,而不一定是单个字符,如x。
我使用Perl的正则表达式的味道。
感谢
答
你有负回顾断言的向后位置。
它是零宽度,所以必须在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
或者,你需要考虑的y
的宽度(或任何与之匹配的是),如果看
y
通过在断言
y
后向后
$ echo $'xy\nay\nyx' | perl -n -e 'print if /y(?<!xy)/'
ay
yx
答
ab
表示a
后面跟着b
。因此,您正在一个位置检查y
,然后检查下一个位置是否先于x
。 它不是由x
—之前它是由y
—开头,这样的模式相匹配。
你想
/(?<!x)y/
或
/(?:^|[^x])y/
你这样做是正确的耶。 a'it。 –