は私がreplaceAllが「不正なグループ参照」で失敗するのはなぜですか?
\\\s+\\$\\$ to $$
の交換が必要で、私は
String s = " $$";
s = s.replaceAll("\\s+\\$\\$","$$");
を使用していますが、それは例外
java.lang.IllegalArgumentExceptionがスローされます。不正なグループ参照
は私がreplaceAllが「不正なグループ参照」で失敗するのはなぜですか?
\\\s+\\$\\$ to $$
の交換が必要で、私は
String s = " $$";
s = s.replaceAll("\\s+\\$\\$","$$");
を使用していますが、それは例外
java.lang.IllegalArgumentExceptionがスローされます。不正なグループ参照
使用を二番目のパラメータで0:
String s=" $$";
s=s.replaceAll("\\s+\\$\\$","\\$\\$");
//or
//s=s.replaceAll("\\s+\\Q$$\\E","\\$\\$");
$
は
だからあなたはここでの問題は、正規表現ではありません、それ
にエスケープする必要がある正規表現の代替パラメータでグループのシンボルであるが、代替:
$は、一致するグループ()
を示すために使用されます。だから、(Javaコンパイラを幸せにするために第二バックスラッシュ)、バックスラッシュと同様にそれをエスケープする必要があります:あなたがする必要があるので、
String s=" $$";
s = s.replaceAll("\\s+\\$\\$", "\\$\\$");
$
は、置換文字列にだけでなく、正規表現で特別な意味を持っていますあまりにも、そこにそれをエスケープ:
s=s.replaceAll("\\s+\\$\\$", "\\$\\$");
String s="$$";
s=s.replaceAll("\\s+\\$\\$","$$");
注意をそのバックスラッシュ(\)交換記号 文字列のドル記号($)は、 がリテラル置換文字列として扱われていた場合と異なる結果になることがあります。 Matcher.replaceAllを参照してください。必要に応じて Matcher.quoteReplacement(java.lang.String)を使用して、これらの文字の特殊な意味を抑止します( )。だから、任意の置換文字列のエスケープ
は次のように行うことができます。また、パターンのエスケープを
String s = " $$";
s = s.replaceAll("\\s+\\$\\$", Matcher.quoteReplacement("$$"));
は、私は同じ問題を抱えていたPattern#quote
String s = " $$";
s = s.replaceAll("\\s+" + Pattern.quote("$$"), Matcher.quoteReplacement("$$"));
+1。あなた自身がエスケープするよりもはるかに優れています –
このソリューションは、動的コンテンツの観点から受け入れられた答えより優れています。 –
置換文字列が99.99_9%で認識されないため、この回答はもっと重要です。 – AxelH
で行うことができ、だから、私はすべてをsplitで置き換えることを実装することになります。
それは、これは正しい方法で
public static String replaceAll(String source, String key, String value){
String[] split = source.split(Pattern.quote(key));
StringBuilder builder = new StringBuilder();
builder.append(split[0]);
for (int i = 1; i < split.length; i++) {
builder.append(value);
builder.append(split[i]);
}
while (source.endsWith(key)) {
builder.append(value);
source = source.substring(0, source.length() - key.length());
}
return builder.toString();
}
私のために例外を解決しました。 \\ $ str.replaceAll("\\$", "\\\\\\$")
javaが2番目のパラメータを通常の文字列の代わりに正規表現として扱っている理由を教えてください。 – FranXho
これは正規表現として扱われていません。 Matcherのドキュメントから。appendReplacement、 "置換文字列には、以前の一致時に取得されたサブシーケンスへの参照が含まれている可能性があります。$ {name}または$ gの各オカレンスは、対応するグループ(name)またはグループ(g)ドル記号($)は、置換文字列の前にバックスラッシュ(\ $)を付けてリテラルとして含めることができます。 – user393274