2014-10-08 67 views
0

我在使用String.replaceAll(String, String)時,我發現用$符號替換字符串是行不通的。示例$REPLACEME$在Linux系統中不會被替換。任何人都知道這是爲什麼?Java替換全部

一些代碼:

String foo = "Some string with $REPLACEME$"; 
foo = foo.replaceAll("$REPLACEME$", "characters"); 
System.out.println(foo); 

輸出:

Some string with $REPLACEME$ 
+2

你爲什麼使用'replaceAll'而不是'replace'?你需要*正則表達式嗎? – 2014-10-08 20:30:03

回答

5

$是需要轉義特殊字符:

foo = foo.replaceAll("\\$REPLACEME\\$", "characters"); 

或者更一般採用Pattern.quote將逃避所有元字符(特殊字符如$?)轉換成字符串文字:

foo = foo.replaceAll(Pattern.quote("$REPLACEME$"), "characters"); 
+0

爲什麼需要轉義? – TameHog 2014-10-08 20:25:17

+2

它表示[正則表達式語法]中一行的結尾(http://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html)。所以,除非你在字符串的開始處有一個字符串結尾......''Pattern_quote'的 – 2014-10-08 20:27:02

+3

+1,我已經在考慮一個答案。 – 2014-10-08 20:27:36

3

replaceAll使用正則表達式作爲第一個參數。 $是匹配在正則表達式匹配的字符串的末尾,以便需要轉義

foo = foo.replaceAll("\\$REPLACEME\\$", "characters"); 
+1

我還會補充說,在純正則表達式中,字符美元符號必須轉義'\ $',但在Java中轉義字符必須轉義,因此'\\ $'。 – Gary 2014-10-08 20:28:32

3

replaceAll方法使用regular expressions錨字符,$字符是在正則表達式的元字符表示的末端串。然而,replace方法也用替換字符串替換目標字符串的所有實例,並使用普通字符串,而不是正則表達式。這將做你所期待的:

String foo = "Some string with $REPLACEME$"; 
foo = foo.replace("$REPLACEME$", "characters"); 
System.out.println(foo);