我可以简化并否定这个吗?^(//|//\s+|\s+//|\s+//\s+)

我可以简化并否定这个吗?^(//|//\s+|\s+//|\s+//\s+)

基本上我想匹配如下注释行:

// 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)

相关内容