2012-08-11 14 views

答えて

36

使用を二番目のパラメータで0:

String s=" $$"; 
s=s.replaceAll("\\s+\\$\\$","\\$\\$"); 
//or 
//s=s.replaceAll("\\s+\\Q$$\\E","\\$\\$"); 

$

だからあなたはここでの問題は、正規表現ではありません、それ

+0

javaが2番目のパラメータを通常の文字列の代わりに正規表現として扱っている理由を教えてください。 – FranXho

+1

これは正規表現として扱われていません。 Matcherのドキュメントから。appendReplacement、 "置換文字列には、以前の一致時に取得されたサブシーケンスへの参照が含まれている可能性があります。$ {name}または$ gの各オカレンスは、対応するグループ(name)またはグループ(g)ドル記号($)は、置換文字列の前にバックスラッシュ(\ $)を付けてリテラルとして含めることができます。 – user393274

5

にエスケープする必要がある正規表現の代替パラメータでグループのシンボルであるが、代替:

$は、一致するグループ()を示すために使用されます。だから、(Javaコンパイラを幸せにするために第二バックスラッシュ)、バックスラッシュと同様にそれをエスケープする必要があります:あなたがする必要があるので、

String s=" $$"; 
s = s.replaceAll("\\s+\\$\\$", "\\$\\$"); 
0

$は、置換文字列にだけでなく、正規表現で特別な意味を持っていますあまりにも、そこにそれをエスケープ:

s=s.replaceAll("\\s+\\$\\$", "\\$\\$"); 
0
String s="$$"; 
     s=s.replaceAll("\\s+\\$\\$","$$"); 
56

String#replaceAll javadocから:

注意をそのバックスラッシュ(\)交換記号 文字列のドル記号($)は、 がリテラル置換文字列として扱われていた場合と異なる結果になることがあります。 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("$$")); 
+6

+1。あなた自身がエスケープするよりもはるかに優れています –

+1

このソリューションは、動的コンテンツの観点から受け入れられた答えより優れています。 –

+0

置換文字列が99.99_9%で認識されないため、この回答はもっと重要です。 – AxelH

0

で行うことができ、だから、私はすべてを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(); 
} 
0

私のために例外を解決しました。 \\ $ str.replaceAll("\\$", "\\\\\\$")