Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
scala regex replaceAllIn can';当替换字符串看起来像正则表达式时,是否不替换?_Regex_Scala - Fatal编程技术网

scala regex replaceAllIn can';当替换字符串看起来像正则表达式时,是否不替换?

scala regex replaceAllIn can';当替换字符串看起来像正则表达式时,是否不替换?,regex,scala,Regex,Scala,我很高兴地运行一个RegexreplaceAllIn已经有一段时间了,但是当replacement字符串中有一个看起来像Regex的东西时,我遇到了一个问题。下面说明了问题(Scala 2.9.1-1)。请注意,真正的问题空间要复杂得多,因此使用更简单的解决方案的想法实际上是站不住脚的(只是为了避免不可避免的“为什么不试试……”:D) 这会出现以下错误: java.lang.IllegalArgumentException: Illegal group reference 如果我将数据从原来的

我很高兴地运行一个Regex
replaceAllIn
已经有一段时间了,但是当
replacement
字符串中有一个看起来像Regex的东西时,我遇到了一个问题。下面说明了问题(Scala 2.9.1-1)。请注意,真正的问题空间要复杂得多,因此使用更简单的解决方案的想法实际上是站不住脚的(只是为了避免不可避免的“为什么不试试……”:D)

这会出现以下错误:

java.lang.IllegalArgumentException: Illegal group reference
如果我将
数据
从原来的内容更改为以下简单内容:

val data = "This will work"
那么一切都好了

看起来,
replaceAllIn
不知何故正在查找第二个字符串,并将其用作另一个RE,以引用从第一个RE中记住的内容。。。但医生们对此只字不提

我错过了什么

edit:好的,在查看了
java.util.regex.Matcher
类之后,预期的修复是:

re.replaceAllIn(source, java.util.regex.Matcher.quoteReplacement(data))

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

val data = "val re = \"\"\"^[^/]*://[^/]*/[^/]*\\$\"\"\".r"
否则,它将被解释为组引用的开头(仅当
$
后面跟有一个或多个数字时才有效)。有关更多详细信息,请参见
java.util.regex.Matcher

替换字符串可能包含对捕获的子序列的引用 在上一次匹配期间:
$g
的每次出现都将替换为 评估
组(g)
的结果。。。美元符号(
$
)可以是 通过在替换字符串前面加上 反斜杠(
\$


更新以处理您的评论和上面的编辑:是的,如果您不使用字符串文字,您可以使用
Matcher.quoteReplacement
(或者如果您是,我想,但在这种情况下转义
$
似乎更容易),至少将来,
quoteReplacement
将作为
scala.util.matching.Regex
上的一种方法提供。

谢谢,先生。我没有想到去看Java文档。。。我想这就是我从未成为真正的Java程序员所得到的。所讨论的
数据实际上来自Scala源文件。我想经验法则是,除非你确切知道你得到了什么,否则先用
$
替换
\$
进行预处理,然后按照你想要的方式处理它。从Scala 2.12.6开始,
quoteReplacement
现在可以在
Scala.util.matching.Regex
val data = "val re = \"\"\"^[^/]*://[^/]*/[^/]*\\$\"\"\".r"