答えで声明:テキストをオン
が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 "'はリテラルに変換されないためです。 –