我多年来一直使用它git grep来搜索固定字符串,但很少使用它来进行正则表达式搜索。
我的代码中有一些带有非本地化字符串的地方。例如:
\n JLabel label = buildLabel("Alphabet");\nRun Code Online (Sandbox Code Playgroud)\n在本例中buildLabel()是继承的实用方法。还有buildBoldLabel()、buildMultiLineLabel()、 和buildTextArea()。
因此,我想在我的代码中搜索这些方法的使用,而不查找本地化字符串。正确的调用应该是:
\n JLabel label = buildLabel(getString("Alphabet"));\nRun Code Online (Sandbox Code Playgroud)\n我非常熟悉正则表达式,并且我发现它git grep支持 Perl 字符类。所以我想这会很容易:
$ git grep -P "buildLabel(\\"\\w+\\")"
这不会返回任何结果。所以我在没有 Perl 扩展的情况下尝试了它。
\n$ git grep "buildLabel(\\"[a-zA-Z_]+\\")"
还是……没有结果。我验证了我可以使用固定字符串进行搜索。
\n$ git grep "buildLabel(\\"Alphabet\\")"
这返回了我已经知道存在的代码中的实例。然而 ...
\n$ git grep -P "buildLabel(\\"Alphabet\\")"
不返回任何结果。
\n我还尝试更改引号字符并得到相同的结果。
\n$ git grep -P 'buildLabel("\\w+")'... 没有结果
$ git grep -P 'buildLabel("Alphabet")'... 没有结果
$ git grep 'buildLabel("Alphabet")'... 1 个预期结果
我在 Linux 上尝试过,结果相同。
\n更新:
\n感谢 @wiktor-stribi\xc5\xbcew 评论说,使用 PCRE 需要转义括号(我总是对此感到困惑)。
\n$ git grep -P 'buildLabel\\("\\w+"\\)'...返回 1 个预期结果。
然而,为什么这些不起作用呢?
\n$ git grep 'buildLabel("[a-zA-Z_]+")'
$ git grep 'buildLabel\\("[a-zA-Z_]+"\\)'
$ git grep 'buildLabel\\("[a-zA-Z_][a-zA-Z_]*"\\)'(如果 + 未实现)
那么我做错了什么git grep?或者它坏了?
仅供参考:我在 macOS Big Sur 上使用 Homebrew 的 git 版本 2.35.1。
\n正则表达式与固定字符串搜索
\n请参考git grep 帮助:
\n-G\n--basic-regexp\nUse POSIX extended/basic regexp for patterns. Default is to use basic regexp.\nRun Code Online (Sandbox Code Playgroud)\n因此,默认情况下,git grep将模式字符串视为 POSIX BRE 正则表达式,而不是固定字符串。
要将git grep模式视为固定字符串,您需要-F:
-F\n--fixed-strings\nUse fixed strings for patterns (don\xe2\x80\x99t interpret pattern as a regex).\nRun Code Online (Sandbox Code Playgroud)\n正则表达式问题
\n您可以使用-P选项启用 PCRE 正则表达式语法,在这种情况下,您应该参考PCRE 文档。
在您的 中git grep -P "buildLabel(\\"\\w+\\")",括号必须被转义才能与文字括号匹配,即它应该是git grep -P "buildLabel\\(\\"\\w+\\"\\)"。
在 中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)。
不起作用,git grep \'buildLabel\\("[a-zA-Z_]+"\\)\'因为\\(...\\)(转义的括号对) 定义了一个捕获组,因此与文字括号不匹配。
与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 中的量词。