为什么我的ack正则表达式会产生额外的意外结果?

Gau*_*ier 4 regex perl ack

我终于学习了regexps和ack训练.我相信这使用Perl regexp.

我想匹配第一个非空白字符所在的所有行,if (<word> !并且元素之间有任意数量的空格.

这就是我想出的:

^[ \t]*if *\(\w+ *!
Run Code Online (Sandbox Code Playgroud)

它几乎起作用了.^[ \t]*是错误的,因为它匹配一个或没有[空格或制表符].我想要的是匹配任何可能只包含空格或制表符(或什么都没有)的东西.

例如,这些不匹配:

// if (asdf != 0)
else if (asdf != 1)
Run Code Online (Sandbox Code Playgroud)

我该如何修改我的正则表达式呢?


编辑添加命令行

ack -i --group -a '^\s*if *\(\w+ *!' c:/work/proj/proj 
Run Code Online (Sandbox Code Playgroud)

注意单引号,我对它们不再那么肯定了.

我的搜索库是一个更大的代码库.它确实包括匹配表达式(非常一些),但即使例如:

274:                }else if (y != 0) 
Run Code Online (Sandbox Code Playgroud)

,由于上面的命令,我得到了.


编辑添加了mobrule的测试结果

Mobrule,谢谢你给我提供了一个测试文本.我会在这里复制我的提示:

C:\Temp\regex>more ack.test
# ack.test
if (asdf != 0)    # no spaces - ok
 if (asdf != 0)   # single space - ok
    if (asdf != 0) # single tab - ok
   if (asdf != 0) # multiple space - ok
        if (asdf != 0) # multiple tab - ok
    if (asdf != 0) # spaces + tab ok
     if (asdf != 0) # tab + space ok
     if (asdf != 0) # space + tab + space ok
// if (asdf != 0)  # not ok
} else if (asdf != 0) # not ok

C:\Temp\regex>ack '^[ \t]*if *\(\w+ *!' ack.test

C:\Temp\regex>"C:\Program\git\bin\perl.exe" C:\bat\ack.pl '[ \t]*if *\(\w+ *!' a
ck.test
if (asdf != 0)    # no spaces - ok
 if (asdf != 0)   # single space - ok
    if (asdf != 0) # single tab - ok
   if (asdf != 0) # multiple space - ok
        if (asdf != 0) # multiple tab - ok
    if (asdf != 0) # spaces + tab ok
     if (asdf != 0) # tab + space ok
     if (asdf != 0) # space + tab + space ok
// if (asdf != 0)  # not ok
} else if (asdf != 0) # not ok
Run Code Online (Sandbox Code Playgroud)

问题在于我打电话给我的ack.bat!

ack.bat包含:

"C:\Program\git\bin\perl.exe" C:\bat\ack.pl %*
Run Code Online (Sandbox Code Playgroud)

虽然我用一个插入符号调用,但它在bat文件的调用中消失了!

逃避插入符^^不起作用.

引用正则表达式" "而不是' '工作.我的问题是DOS/win问题,很抱歉打扰你们.

DVK*_*DVK 6

^\s*if\s*\(\S+\s*!
Run Code Online (Sandbox Code Playgroud)
  • 使用\S非空白.\w不匹配任何特殊字符,所以if ($word不匹配.可能你的规格没问题,在这种情况下\w(字母数字加上"_")就行了
$ perl5.8 -e '{$s="else if (asdf \!= 1)"; if ($s =~ /^\s*if\s*\((\S+)\s*\!/) { print "|$1|\n";} else { print "NO MATCH\n";}}'
NO MATCH
$ perl5.8 -e '{$s="// if (asdf \!= 0)"; if ($s =~ /^\s*if\s*\((\S+)\s*\!/) { print "|$1|\n";} else { print "NO MATCH\n";}}'
NO MATCH
$ perl5.8 -e '{$s=" if (asdf \!= 0)"; if ($s =~ /^\s*if\s*\((\S+)\s*\!/) { print "|$1|\n";} else { print "NO MATCH\n";}}'  
|asdf|
$ perl5.8 -e '{$s="if (asdf \!= 0)"; if ($s =~ /^\s*if\s*\((\S+)\s*\!/) { print "|$1|\n";} else { print "NO MATCH\n";}}' 
|asdf|
$ perl5.8 -e '{$s="if (\$asdf \!= 0)"; if ($s =~ /^\s*if\s*\((\S+)\s*\!/) { print "|$1|\n";} else { print "NO MATCH\n";}}'
|$asdf|