2014-12-09 91 views
5

我有一個字符串s和一個正則表達式。我希望用替換字符串替換s中的正則表達式的每個匹配項。替換字符串可能包含一個或多個反斜槓。要執行替換,我使用的是MatcherappendReplacement方法。匹配器的appendReplacement方法忽略替換的反斜槓

appendReplacement的問題是,它忽略了它在替換字符串中遇到的所有反斜槓。所以,如果我嘗試用替換字符串"a\\b"替換字符串"one match"在子"match",然後appendReplacement導致"one ab"而不是"one a\\b" *:

Matcher matcher = Pattern.compile("match").matcher("one match"); 
StringBuffer sb = new StringBuffer(); 
matcher.find(); 
matcher.appendReplacement(sb, "a\\b"); 
System.out.println(sb); // one ab 

我已經採取了看看appendReplacement的代碼,並且發現了它會跳過任何遇到的反斜槓:

if (nextChar == '\\') { 
    cursor++ 
    nextChar = replacement.charAt(cursor); 
    ... 
} 

如何將每個匹配替換爲包含反斜槓的替換字符串?

(*) - 請注意,在"a\\b"中有一個反斜槓,而不是兩個。反斜槓只是逃脫。

+0

'「a」+「\」+「b」'??????? – vks 2014-12-09 12:35:39

+0

@vks:如果你問我的示例替換字符串是否是「」a「+」\「+」b「',那麼是的,除了'」\「'是非法的Java字符串,因爲你必須轉義反斜槓。 – snakile 2014-12-09 12:45:53

+0

我實際上是在問這個替換工作是否有效:P – vks 2014-12-09 12:46:36

回答

2

您需要雙逃逸反斜線即:

matcher.appendReplacement(sb, "a\\\\b"); 

全碼:

Matcher matcher = Pattern.compile("match").matcher("one match"); 
sb = new StringBuffer(); 
matcher.find(); 
matcher.appendReplacement(sb, "a\\\\b"); 
System.out.println(sb); //-> one a/b 

原因是Java允許你在替換字符串中使用反向引用像$1$2等,並強制執行相同的轉義反斜線機制在主正則表達式。

2

你需要逃脫越獄

Matcher matcher = Pattern.compile("match").matcher("one match"); 
StringBuffer sb = new StringBuffer(); 
matcher.find(); 
matcher.appendReplacement(sb, "a\\\\b"); 
System.out.println(sb); 

或者使用replace()

String test="one match"; 
test=test.replace("match", "a\\b"); 
System.out.println(test); 

輸出:

one a\b 
+0

只是fyi,原來的答案只有'replace'代碼,但現在'matcher.appendReplacement(sb,「a \\\\ b」);'也出現在我的答案之後 – anubhava 2014-12-09 12:43:31

+0

這是什麼錯誤? – 2014-12-09 12:44:11