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正则表达式.
谢谢
你有负面回顾断言的位置.
它是零宽度,因此需要在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)
ab意味着a紧随其后b.因此,您正在检查y一个位置,然后检查下一个位置是否在前面x.它前面没有x-it的前缀y- 所以模式匹配.
你要
/(?<!x)y/
Run Code Online (Sandbox Code Playgroud)
要么
/(?:^|[^x])y/
Run Code Online (Sandbox Code Playgroud)