2010-11-05 46 views
5

我試圖替換包含字符「$」的子字符串。我很高興聽到它爲什麼沒有這樣工作,以及它會如何工作。替換子字符串(replaceAll)解決方法

感謝, USER_UNKNOWN

public class replaceall { 
    public static void main(String args[]) { 
     String s1= "$foo - bar - bla"; 
     System.out.println("Original string:\n"+s1); 
     String s2 = s1.replaceAll("bar", "this works"); 
     System.out.println("new String:\n"+s2); 
     String s3 = s2.replaceAll("$foo", "damn"); 
     System.out.println("new String:\n"+s3); 
    } 

} 
+0

這是什麼打印出來的? '$ foo - 這個工程 - bla'? – Entity 2010-11-05 12:32:30

+0

可能重複[反斜槓問題與String.replaceAll](http://stackoverflow.com/questions/1701839/backslash-problem-with-string-replaceall) – McDowell 2011-05-26 08:37:02

回答

14

Java's .replaceAll隱式使用正則表達式來代替。這意味着,$foo被解釋爲正則表達式模式,並且$在正則表達式中是特殊的(意思是「字符串結尾」)。

你需要躲避$作爲

String s3 = s2.replaceAll("\\$foo", "damn"); 

如果目標變量,可以使用Pattern.quote逃脫爪哇≥1.5所有的特殊字符,如果更換也是一個變量,使用Matcher.quoteReplacement

String s3 = s2.replaceAll(Pattern.quote("$foo"), Matcher.quoteReplacement("damn")); 

對於Java≥1.5,您可以使用use .replace instead

String s3 = s2.replace("$foo", "damn"); 

結果:http://www.ideone.com/Jm2c4

+1

很好的答案,但恕我直言,你解決了錯誤的問題。 – 2010-11-05 12:42:13

+2

還要注意替換'replaceAll()'的字符串也可能需要轉義(使用'Pattern.quoteReplacement()')。 – axtavt 2010-11-05 13:38:11

+0

@axtavt:好點 – 2010-11-05 13:45:09

5

IIRC,採取的replaceAll一個正則表達式:嘗試逃脫$,這種方式:

String s3 = s2.replaceAll("\\$foo", "damn"); 
9

如果你不需要正則表達式的功能,不使用正則表達式的版本。

使用String.replace(str, str)代替:

String s = "$$$"; 
String rep = s.replace("$", "€"); 
System.out.println(rep); 
// Output: €€€ 

參考:

+1

+1 - 我接受了這個答案。 replaceAll用於替換模式的匹配,替換char序列替換(這正是我們想要的) – 2010-11-05 12:55:05

0
public static String safeReplaceAll(String orig, String target, String replacement) { 
    replacement = replacement.replace("$", "\\$"); 
    return orig.replaceAll(target, replacement); 
}