我一直很開心地運行Regex replaceAllIn
很長一段時間,但當replacement
字符串看起來像一個正則表達式時遇到了問題。以下說明了這個問題(Scala 2.9.1-1)。需要注意的是,真正的問題是空間要複雜得多,因此使用一個簡單的解決方案的思路是不是真正站得住腳的(只是爲了搶佔不可避免「你爲什麼不試試...」:d)scala正則表達式replaceAllIn不能替換時,替換字符串看起來像一個正則表達式?
val data = "val re = \"\"\"^[^/]*://[^/]*/[^/]*$\"\"\".r"
val source = """here
LATEX_THING{abc}
there"""
val re = "LATEX_THING\\{abc\\}".r
println(re.replaceAllIn(source, data))
這呈現了以下錯誤:
java.lang.IllegalArgumentException: Illegal group reference
如果我改變data
從什麼是喜歡簡單的東西:
val data = "This will work"
然後一切都很好。
它看起來像replaceAllIn
以某種方式查找第二個字符串,並將其用作另一個RE來引用從第一個RE中記住的內容......但文檔對此沒有提及。
我錯過了什麼?
編輯:好了,所以看java.util.regex.Matcher
下課後,它似乎是預期的解決方法是:
re.replaceAllIn(source, java.util.regex.Matcher.quoteReplacement(data))
謝謝先生。我沒有想過要去看Java文檔......我想這就是我從未成爲真正的Java編碼人員的原因。有問題的數據實際上來自Scala源文件。我猜測經驗法則是,除非你確切地知道你得到了什麼,否則先用'$'代替'\ $'來預處理它,然後按照你想要的方式處理它。 – 2012-03-11 21:43:38