2017-03-31 4 views
-2

は、次のコードの断片を考えてみましょう: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に記載されているように、最初の方が読みやすくなっています。 しかし、どちらの方法がより良いまたは

+0

Euhm '' \\ Q [regex] \\ E "' \\ Q \\ Q [regex] \\ E \\\\ E \\ Q \\ E "' ... –

+0

@WillemVanOnsemなぜですか? – sudo

+0

それ以外の場合、入力中の\\ E "'はリテラルに変換されないためです。 –

答えて

1

答えで声明:テキストをオン

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"に置き換えなければなりません。