gpt4 book ai didi

regex - 为什么我的 ack 正则表达式会得到额外的、意想不到的结果?

转载 作者:行者123 更新时间:2023-12-04 22:37:50 25 4
gpt4 key购买 nike

我终于开始学习正则表达式和训练 ack .我相信这使用 Perl 正则表达式。

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

这就是我想出的:

^[ \t]*if *\(\w+ *!

它只是几乎奏效。 ^[ \t]*是错误的,因为它匹配一个或不匹配 [空格或制表符]。
我想要的是匹配任何可能只包含空格或制表符(或什么都不包含)的内容。

例如,这些不应该匹配:
// if (asdf != 0)
else if (asdf != 1)

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

编辑 添加命令行
ack -i --group -a '^\s*if *\(\w+ *!' c:/work/proj/proj 

注意单引号,我对它们不太确定了。

我的搜索库是一个更大的代码库。它确实包括匹配表达式(相当多),但即使是例如:
274:                }else if (y != 0) 

,我得到了上述命令的结果。

编辑 添加 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

问题出在我对 ack.bat 的调用中!

ack.bat 包含:
"C:\Program\git\bin\perl.exe" C:\bat\ack.pl %*

虽然我用插入符号调用,但它在 bat 文件的调用中逃脱了!

使用 ^^ 转义插入符号不起作用。

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

最佳答案

^\s*if\s*\(\S+\s*!
  • 使用 \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";} }'
    不匹配
    $ perl5.8 -e '{$s="//if (asdf\!= 0)"; if ($s =~/^\s*if\s*\((\S+)\s*\!/) { print "|$1|\n";} else { print "NO MATCH\n";} }'
    不匹配
    $ 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|

    关于regex - 为什么我的 ack 正则表达式会得到额外的、意想不到的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2638596/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com