多年来,我一直使用 git grep
来搜索固定字符串,但并没有经常使用它进行正则表达式搜索。
我的代码中有一些非本地化的字符串。例如:
JLabel label = buildLabel("Alphabet");
在这个例子中,
buildLabel()
是一个继承来的实用方法。还有buildBoldLabel()
、 buildMultiLineLabel()
和buildTextArea()
。因此,我想在我的代码中搜索使用这些方法但没有查找本地化字符串的情况。正确的调用应该是:
JLabel label = buildLabel(getString("Alphabet"));
我非常熟悉正则表达式,并且我注意到
git grep
支持Perl字符类。因此,我认为这应该很容易:
$ git grep -P "buildLabel(\"\w+\")"
然而,这没有返回任何结果。所以我尝试了没有使用Perl扩展的方式。
$ git grep "buildLabel(\"[a-zA-Z_]+\")"
仍然没有结果。我验证了可以使用固定字符串进行搜索。
$ git grep "buildLabel(\"Alphabet\")"
它返回了代码中我已经知道存在的实例。然而...
$ git grep -P "buildLabel(\"Alphabet\")"
没有结果。我也尝试更改引号,但结果相同。
$ git grep -P 'buildLabel("\w+")'
... 没有结果
$ git grep -P 'buildLabel("Alphabet")'
... 没有结果
$ git grep 'buildLabel("Alphabet")'
... 预期结果1个我在Linux上尝试过,结果相同。
更新:
感谢@wiktor-stribiżew的评论提醒,PCRE需要转义括号(我总是被这个搞混)。
$ git grep -P 'buildLabel\("\w+"\)'
... 返回预期结果1个。然而,这些为什么不行?
$ git grep 'buildLabel("[a-zA-Z_]+")'
$ git grep 'buildLabel\("[a-zA-Z_]+"\)'
$ git grep 'buildLabel\("[a-zA-Z_][a-zA-Z_]*"\)'
(如果+没有实现)
所以,我在使用
git grep
时做错了什么?还是它有问题?FYI:我正在使用来自Homebrew的macOS Big Sur上的git版本2.35.1。
(
和)
才能匹配文字括号。应该像这样使用:git grep -P 'buildLabel\("\w+"\)'
。 - Wiktor Stribiżew