如何将 git grep 与正则表达式一起使用?

chr*_*ish 5 git grep

我多年来一直使用它git grep来搜索固定字符串,但很少使用它来进行正则表达式搜索。

\n

我的代码中有一些带有非本地化字符串的地方。例如:

\n
   JLabel label =  buildLabel("Alphabet");\n
Run Code Online (Sandbox Code Playgroud)\n

在本例中buildLabel()是继承的实用方法。还有buildBoldLabel()buildMultiLineLabel()、 和buildTextArea()

\n

因此,我想在我的代码中搜索这些方法的使用,而不查找本地化字符串。正确的调用应该是:

\n
   JLabel label =  buildLabel(getString("Alphabet"));\n
Run Code Online (Sandbox Code Playgroud)\n

我非常熟悉正则表达式,并且我发现它git grep支持 Perl 字符类。所以我想这会很容易:

\n

$ git grep -P "buildLabel(\\"\\w+\\")"

\n

这不会返回任何结果。所以我在没有 Perl 扩展的情况下尝试了它。

\n

$ git grep "buildLabel(\\"[a-zA-Z_]+\\")"

\n

还是……没有结果。我验证了我可以使用固定字符串进行搜索。

\n

$ git grep "buildLabel(\\"Alphabet\\")"

\n

这返回了我已经知道存在的代码中的实例。然而 ...

\n

$ git grep -P "buildLabel(\\"Alphabet\\")"

\n

不返回任何结果。

\n

我还尝试更改引号字符并得到相同的结果。

\n

$ git grep -P 'buildLabel("\\w+")'... 没有结果

\n

$ git grep -P 'buildLabel("Alphabet")'... 没有结果

\n

$ git grep 'buildLabel("Alphabet")'... 1 个预期结果

\n

我在 Linux 上尝试过,结果相同。

\n

更新:

\n

感谢 @wiktor-stribi\xc5\xbcew 评论说,使用 PCRE 需要转义括号(我总是对此感到困惑)。

\n

$ git grep -P 'buildLabel\\("\\w+"\\)'...返回 1 个预期结果。

\n

然而,为什么这些不起作用呢?

\n

$ git grep 'buildLabel("[a-zA-Z_]+")'

\n

$ git grep 'buildLabel\\("[a-zA-Z_]+"\\)'

\n

$ git grep 'buildLabel\\("[a-zA-Z_][a-zA-Z_]*"\\)'(如果 + 未实现)

\n
\n

那么我做错了什么git grep?或者它坏了?

\n

仅供参考:我在 macOS Big Sur 上使用 Homebrew 的 git 版本 2.35.1。

\n

Wik*_*żew 3

正则表达式与固定字符串搜索

\n

请参考git grep 帮助

\n
-G\n--basic-regexp\nUse POSIX extended/basic regexp for patterns. Default is to use basic regexp.\n
Run Code Online (Sandbox Code Playgroud)\n

因此,默认情况下,git grep将模式字符串视为 POSIX BRE 正则表达式,而不是固定字符串

\n

要将git grep模式视为固定字符串,您需要-F

\n
-F\n--fixed-strings\nUse fixed strings for patterns (don\xe2\x80\x99t interpret pattern as a regex).\n
Run Code Online (Sandbox Code Playgroud)\n

正则表达式问题

\n

您可以使用-P选项启用 PCRE 正则表达式语法,在这种情况下,您应该参考PCRE 文档

\n

在您的 中git grep -P "buildLabel(\\"\\w+\\")",括号必须被转义才能与文字括号匹配,即它应该是git grep -P "buildLabel\\(\\"\\w+\\"\\)"

\n

在 中git grep \'buildLabel("[a-zA-Z_]+")\',您使用的是POSIX BRE regex,并且+被解析为文字+字符,而不是一个或多个量词。不过,您可以git grep \'buildLabel("[a-zA-Z_]\\{1,\\}")\'在 POSIX BRE 中使用。如果它是 GNU grep,您可以使用git grep \'buildLabel("[a-zA-Z_]\\+")\'(不确定它是否适用于git)。

\n

不起作用,git grep \'buildLabel\\("[a-zA-Z_]+"\\)\'因为\\(...\\)(转义的括号对) 定义了一个捕获组,因此与文字括号不匹配。

\n

git grep -e \'buildLabel\\("[a-zA-Z_][a-zA-Z_]*"\\)\'POSIX BRE 相同,要使其成为POSIX ERE,您需要使用-E选项git grep -E \'buildLabel\\("[a-zA-Z_][a-zA-Z_]*"\\)\'. 或者git grep -E \'buildLabel\\("[a-zA-Z_]+"\\)\',未转义的+是 POSIX ERE 中的量词。

\n

另请参阅正则表达式中必须转义哪些特殊字符?

\n