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

dev*_*ium 4 regex perl negative-lookbehind

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

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

但奇怪的是,它是.我也试过@ https://regex101.com/,结果是一样的.它似乎会匹配y,这让我感到困惑.如果我的理解是正确的,那么上面的正则表达式应该只匹配前面没有 a的ys .x

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

我正在使用Perl正则表达式.

谢谢

daw*_*awg 5

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

它是零宽度,因此需要在y您编写它之前.

鉴于:

$ echo $'xy\nay\nyx' 
xy
ay
yx
Run Code Online (Sandbox Code Playgroud)

lookbehind /y(?<!x)/匹配x前面或后面的行,y因为y它位于断言后面(不是x):

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

请注意,yx因为断言先于x并且正在查看,y因此所有三行都匹配,因此也匹配.

你想要的:

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

演示

进一步说明.

或者,y如果在断言中y包含以下内容后向后看,则需要考虑(或匹配的是什么)的宽度y:

$ echo $'xy\nay\nyx' | perl -n -e 'print if /y(?<!xy)/'
ay
yx
Run Code Online (Sandbox Code Playgroud)


ike*_*ami 5

ab意味着a紧随其后b.因此,您正在检查y一个位置,然后检查下一个位置是否在前面x.它前面没有x-it的前缀y- 所以模式匹配.

你要

/(?<!x)y/
Run Code Online (Sandbox Code Playgroud)

要么

/(?:^|[^x])y/
Run Code Online (Sandbox Code Playgroud)