加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-14 06:25:26 所属栏目:百科 来源:网络整理
导读:我一直很高兴地运行 Regex replaceAllIn很长一段时间但是当替换字符串看起来像一个正则表达式时遇到了问题.以下说明了问题( Scala 2.9.1-1).请注意,真正的问题空间要复杂得多,因此使用更简单的解决方案的想法并不是真的可行(只是为了抢占不可避免的“你为什
我一直很高兴地运行 Regex replaceAllIn很长一段时间但是当替换字符串看起来像一个正则表达式时遇到了问题.以下说明了问题( 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))

这会出现以下错误:

java.lang.IllegalArgumentException: Illegal group reference

如果我将数据从简单的内容更改为简单的内容:

val data = "This will work"

一切都很好.

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

我错过了什么?

编辑:好的,所以在查看java.util.regex.Matcher类之后,似乎预期的修复是:

re.replaceAllIn(source,java.util.regex.Matcher.quoteReplacement(data))
你需要在替换字符串中转义$:
val data = "val re = """^[^/]*://[^/]*/[^/]*$""".r"

否则,它被解释为组引用的开头(仅当$后跟一个或多个数字时才有效).有关更多详细信息,请参阅the documentation for java.util.regex.Matcher:

The replacement string may contain references to subsequences captured
during the previous match: Each occurrence of $g will be replaced by
the result of evaluating group(g)… A dollar sign ($) may be
included as a literal in the replacement string by preceding it with a
backslash ($).

更新以解决您的评论并在上面编辑:是的,如果您不使用字符串文字(或者如果您是,我猜,但是在这种情况下逃避$似乎更容易),您可以使用Matcher.quoteReplacement,并且至少a chance将来,indexReplacement将作为scala.util.matching.Regex上的方法提供.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读