考慮下面的代碼片段:Pattern.quote()和它的字符串串聯等效之間的區別?
Pattern p = Pattern.compile(Pattern.quote("[r.e.g.e.x]"));
和
Pattern p = Pattern.compile("\\Q" + "[r.e.g.e.x]" + "\\E");
據我所知,他們生產完全相同的輸出。我知道第一個更容易閱讀,如this answer中所述。 但是哪種方法更好更好或更快?
考慮下面的代碼片段:Pattern.quote()和它的字符串串聯等效之間的區別?
Pattern p = Pattern.compile(Pattern.quote("[r.e.g.e.x]"));
和
Pattern p = Pattern.compile("\\Q" + "[r.e.g.e.x]" + "\\E");
據我所知,他們生產完全相同的輸出。我知道第一個更容易閱讀,如this answer中所述。 但是哪種方法更好更好或更快?
在回答聲明:
調用
Pattern.quote()
方法封裝在字符串中\Q...\E
,果然文字變成一個正則表達式文字。
是嚴格地說不正確。確實。因爲如果\Q
和\E
已經在原始字符串中,那會給出奇怪的結果。
如果您打電話給例如Pattern.quote("\\Q[r.e.g.e.x]\\E")
它將產生"\\Q\\Q[r.e.g.e.x]\\E\\\\E\\Q\\E"
。
結果包裹"\\Q"
和"\\E"
顯然是不正確(對於某些邊緣的情況下,我承認)。如果您想成爲安全,您最好使用Pattern.quote
。
與"\\Q"
和"\\E"
你自己做會更快一點(因爲你節省的方法調用,如果一個indexOf(..)
和if
聲明沒有"\\E"
)的包裝,但通常你最好利用圖書館自他們傾向於包含更少的錯誤,並且如果有錯誤,這些最終會被解決。
您可以找到source code here:
public static String quote(String s) { int slashEIndex = s.indexOf("\\E"); if (slashEIndex == -1) return "\\Q" + s + "\\E"; StringBuilder sb = new StringBuilder(s.length() * 2); sb.append("\\Q"); slashEIndex = 0; int current = 0; while ((slashEIndex = s.indexOf("\\E", current)) != -1) { sb.append(s.substring(current, slashEIndex)); current = slashEIndex + 2; sb.append("\\E\\\\E\\Q"); } sb.append(s.substring(current, s.length())); sb.append("\\E"); return sb.toString(); }
所以只要沒有"\\E"
,我們都很好。但在另一種情況下,我們必須每"\\E"
替換"\\E\\\\E\\Q"
...
Euhm''\\ Q [regex] \\ E「'會產生''\\ Q \\ Q [regex] \\ E \\\\ E \\ Q \\ E「'... –
@WillemVanOnsem爲什麼? – sudo
,否則輸入中的'\\ E「將不會被轉換爲文字。 –