2012-12-03 136 views
1

下面我試圖用替換字符串xxx替換精確的搜索字符串。我有類似於Java日誌消息的字符串原始。正如你可以看到,如果搜索字符串是「變量」,我可以用xxx成功替換它,但是當搜索字符串是「variable.method()」或「variable.method2()」時,我無法替換它。我在這裏做錯了什麼?Scala正則表達式replaceAllIn與特殊字符完全匹配

val original = """variable+ " is in " + variable.method() + " and " + variable.method2()""" 
val replaceStr = "xxx" 
val searchStr = "variable.method()" // This can change like in the output below 
val variableExtracter = ("(?<=^|\\s|\\+)"+searchStr+"(?=\\s|$|\\+)").r 
print("Search string : " + searchStr + "\n") 
print("Original :" + original + "\n") 
val formatted = variableExtracter.replaceAllIn(original, replaceStr) 
print("Formatted :" + formatted + "\n") 

Output: 

Search string : variable //CORRECT OUTPUT 
Original :variable+ " is in " + variable.method() + " and " + variable.method2() 
Formatted :xxx+ " is in " + variable.method() + " and " + variable.method2() 
--- 
Search string : variable.method() 
Original :variable+ " is in " + variable.method() + " and " + variable.method2() 
Formatted :variable+ " is in " + variable.method() + " and " + variable.method2() 
//EXPECTED OUTPUT: variable+ " is in " + xxx + " and " + variable.method2() 
--- 
Search string : variable.method2() 
Original :variable+ " is in " + variable.method() + " and " + variable.method2() 
Formatted :variable+ " is in " + variable.method() + " and " + variable.method2() 
//EXPECTED OUTPUT:variable+ " is in " + variable.method() + " and " + xxx 
--- 
Search string : variable.method() 
Original :variable.method()+ " has " + variable + " and " + variable.method2() 
Formatted :variable.method()+ " has " + variable + " and " + variable.method2() 
//EXPECTED OUTPUT:xxx+ " has " + variable + " and " + variable.method2() 
+0

您期待接收「xxx.method()」還是用「xxx」完全替換「variable.method()」? – tysonjh

+0

我正在嘗試替換EXACT MATCH搜索字符串。所以上面我試圖用xxx替換完整的「variable.method()」。 – yalkris

+0

您需要轉義searchStr中的特殊字符 – tysonjh

回答

1

編輯:

可以使用Java Pattern quote methodPattern.quote(searchStr)來包裝你與\Q\E字符串。

scala> import java.util.regex.Pattern 
import java.util.regex.Pattern 

scala> val variableExtracter = ("(?<=^|\\s|\\+)"+Pattern.quote(searchStr)+"(?=\\s|$|\\+)").r 
variableExtracter: scala.util.matching.Regex = (?<=^|\s|\+)\Qvariable.method2()\E(?=\s|$|\+) 

scala> print("Search string : " + searchStr + "\n") 
Search string : variable.method2() 

scala> print("Original :" + original + "\n") 
Original :variable+ " is in " + variable.method() + " and " + variable.method2() 

scala> val formatted = variableExtracter.replaceAllIn(original, replaceStr) 
formatted: String = variable+ " is in " + variable.method() + " and " + xxx 

scala> print("Formatted :" + formatted + "\n") 
Formatted :variable+ " is in " + variable.method() + " and " + xxx 

scala> val searchStr = "variable.method()" 
searchStr: java.lang.String = variable.method() 

scala> val variableExtracter = ("(?<=^|\\s|\\+)"+Pattern.quote(searchStr)+"(?=\\s|$|\\+)").r 
variableExtracter: scala.util.matching.Regex = (?<=^|\s|\+)\Qvariable.method()\E(?=\s|$|\+) 

scala> val formatted = variableExtracter.replaceAllIn(original, replaceStr) 
formatted: String = variable+ " is in " + xxx + " and " + variable.method2() 
+0

如果搜索字符串是「變量」,那麼我將在「+ xxx.method()+」和「+ xxx.method xxx.method2()'。我希望替換行能夠匹配我的搜索字符串(這是一個由開始/結尾,空格或加號隔開的單詞) – yalkris

+0

您應該使用'Pattern.quote(searchStr)'然後逃避你的字符串文字。 – tysonjh

+0

@yalkris我更新了答案以反映這種方法。 – tysonjh

相關問題