当替换字符串看起来像正则表达式时,scala regex replaceAllIn无法替换?

Der*_*att 8 regex scala

我很高兴地运行了一个正则表达式replaceAllIn很长一段时间,但当replacement字符串看起来像一个正则表达式的东西时遇到了问题.以下说明了问题(Scala 2.9.1-1).请注意,真正的问题空间要复杂得多,因此使用更简单的解决方案的想法并不是真的可行(只是为了抢占不可避免的"为什么不试试......":D)

val data = "val re = \"\"\"^[^/]*://[^/]*/[^/]*$\"\"\".r"
val source = """here
LATEX_THING{abc}
there"""
val re = "LATEX_THING\\{abc\\}".r
println(re.replaceAllIn(source, data))
Run Code Online (Sandbox Code Playgroud)

这会出现以下错误:

java.lang.IllegalArgumentException: Illegal group reference
Run Code Online (Sandbox Code Playgroud)

如果我data从简单的东西改变为简单的东西:

val data = "This will work"
Run Code Online (Sandbox Code Playgroud)

一切都很好.

它看起来像是replaceAllIn以某种方式查看第二个字符串并将其用作另一个RE来引用从第一个RE记住的内容......但是文档对此没有任何说明.

我错过了什么?

编辑:好的,所以看完java.util.regex.Matcher课后,似乎预期的修复是:

re.replaceAllIn(source, java.util.regex.Matcher.quoteReplacement(data))
Run Code Online (Sandbox Code Playgroud)

Tra*_*own 10

您需要$在替换字符串中转义:

val data = "val re = \"\"\"^[^/]*://[^/]*/[^/]*\\$\"\"\".r"
Run Code Online (Sandbox Code Playgroud)

否则,它被解释为组引用的开头(只有在$后跟一个或多个数字时才有效).请参阅该文档java.util.regex.Matcher更多细节:

替换字符串可能包含对上一次匹配期间捕获的子序列的引用:每次出现都$g将被评估结果替换group(g)...美元符号($)可以作为替换字符串中的文字包含在前面,并带有反斜杠(\$).

更新,以解决您的评论和编辑上面:是的,你可以使用Matcher.quoteReplacement,如果你不字符串文字工作(或者,如果你是,我猜,但逃避$在这种情况下,似乎更容易),并且至少还有一个机会,quoteReplacement会作为scala.util.matching.Regex未来的方法可用.