基本上我想匹配如下注释行:
// foobar (this is a commented line)
但我想确保即使在这种情况下注释签名“//”两边都有空格,我也能捕获这一行。
^(//|//\s+|\s+//|\s+//\s+)\bfoobar.*$
我设法将其简化为:^(\s*//\s*)\bfoobar.*$
否定:这里我需要你的帮助。
我尝试了这个:^(?!(\s*\/{2}\s*)\bfoobar.*$).*$
,但是它匹配除了以注释开头的行之外的所有行。
我只需要包含 foobar 但未注释的行!
答案1
使用:^(?!\h*//)\h*foobar\b
或者^(?!\h*//).*\bfoobar\b
如果前面有一些字符foobar
解释:
^ # beginning of line
(?! # negative lookahead, make sure we haven't
\h* # 0 or more horizontal spaces
// # 2 slashes
) # end lookahead
\h* # 0 or more horizontal spaces
foobar # literally "foobar"
\b # word boundary, to not match "foobarbar"
代码:
#!/usr/bin/perl
use strict;
use warnings;
while(<DATA>) {
say "Match: $_" if m~^(?!\h*//)\h*foobar\b~;
}
__DATA__
// foobar (this is a commented line)
// foofoo (this is a commented line)
foobar (this is an uncommented line)
输出:
Match: foobar (this is an uncommented line)