多年來,我一直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什么?還是壞了?
僅供參考:我在 macOS Big Sur 上使用 Homebrew 的 git 版本 2.35.1。
uj5u.com熱心網友回復:
正則運算式與固定字串搜索
請參考git grep 幫助:
-G
--basic-regexp
Use POSIX extended/basic regexp for patterns. Default is to use basic regexp.
因此,默認情況下,git grep將模式字串視為 POSIX BRE 正則運算式,而不是固定字串。
要將git grep模式視為固定字串,您需要-F:
-F
--fixed-strings
Use fixed strings for patterns (don’t interpret pattern as a regex).
正則運算式問題
您可以使用選項啟用 PCRE 正則運算式語法-P,在這種情況下,您應該參考PCRE 檔案。
在您git grep -P "buildLabel(\"\w \")"的 中,必須對括號進行轉義才能匹配為文字括號,即應該是git grep -P "buildLabel\(\"\w \"\)".
在git grep 'buildLabel("[a-zA-Z_] ")'中,您使用的是POSIX BRE 正則運算式,并被 決議為文字 字符,而不是一個或多個量詞。不過,您可以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 中的量詞。
另外,請參閱在正則運算式中必須轉義哪些特殊字符?
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/426167.html
