2012-08-11 19 views

cevap

36

Kullanımıİkinci parametrede 0:

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

$

Yani burada sorun normal ifade değil o

+0

da beni açıklayabilir misiniz kaçan \\ tarafından Yazınsal $ değiştirilsin mi? – FranXho

+1

Normal bir ifade olarak davranmıyor. Matcher dokümantasyonundan.appendReplacement, "Değiştirme dizesi, önceki eşleşme sırasında yakalanan alt dizelere başvurular içerebilir: Her $ {name} veya $ g oluşumu, sırasıyla ilgili grup (ad) veya grup (g) değerlendirmesinin sonucuyla değiştirilir ... Bir dolar işareti ($), bir ters eğik çizgi (\ $) ile önüne geçerek, yedek dizede bir hazır bilgi olarak eklenebilir. " – user393274

5

kaçmak gerekir Regex 'yenilemesi parametresinde grup sembolüdür, ancak yedek:

$, () eşleşme grupları için kullanılır. Yani (java derleyici mutlu etmek ve ikinci bir ters eğik çizgi) ters eğik çizgi de onu kaçmak gerekir: Eğer zorunda

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

$, yedek dizede yanı sıra regex özel bir anlamı vardır orada da kaçış:

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

String#replaceAll javadoc Gönderen:

Not olduğu ters eğik çizgi (\) ve yedek dizesindeki dolar işaretleri ($), sonuçların, bir tam değiştirme dizesi olarak kabul edilen 'dan farklı olmasına neden olabilir; Matcher.replaceAll. İsterseniz, bu karakterlerin özel anlamını bastırmak için Matcher.quoteReplacement (java.lang.String) öğesini kullanın.

Yani keyfi bir yedek dizesi kaçan aşağıdaki gibi yapılabilir:

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

Ayrıca desen kaçan, ben aynı problem vardı Pattern#quote

String s = " $$"; 
s = s.replaceAll("\\s+" + Pattern.quote("$$"), Matcher.quoteReplacement("$$")); 
+6

+1. Kendinizden kaçmaktan çok daha iyi –

+1

Bu çözüm, dinamik içerik açısından kabul edilen cevaptan daha iyidir. –

+0

Sincethe yedek dizgi% 99.99_9'da bilinmeyen, bu cevabın çok daha fazla özelliği var. – AxelH

0

ile yapılabilir Bu yüzden tüm uygulamaların yerini split ile değiştirin.
O Bu hak yoludur bana

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

için istisna çözdü. java yerine normal bir dize regex olarak ikinci parametre tedavi neden $ str.replaceAll("\\$", "\\\\\\$")

İlgili konular