如何在scala正则表达式中使用replaceAllIn只替换捕获匹配

时间:2015-06-06 05:12:28

标签: regex scala

抱歉,如果标题不清楚,如果您建议更好的标题,我可以更改它,问题是:

我有这样的字符串

val text1 = "123 456 blah 345qq"

和此代码

val rx1 = """(\d+)\s+\d+""" .r
def something(a : String) = s"<:$a:>"
rx1.replaceAllIn(text1,(m)=> something(???))

我只是想替换括号之间的捕捉匹配,这意味着结果必须是

 <:123:> 456 blah 345qq

使用

  rx1.replaceAllIn(text1,(m)=> something(m) 

捕获整个匹配:不仅第一个数字也是空格(s)和下一个数字(s)导致类似的结果&lt;:123 456:&gt; blah 345qq所以我知道我必须在regex.Match中使用group方法

rx1.replaceAllIn(text1,(m)=> something(m.group(1)))

这有点好,但结果是&lt;:123:&gt; blah 345qq,通知比数字456被删除

<:123:> blah 345qq wrong!
<:123:> 456 blah 345qq right

怎么能以一种不错的scala惯用方式来实现这个目标?...谢谢!!!。

1 个答案:

答案 0 :(得分:1)

有API可以做到:

scala> r.replaceAllIn(text, m => s"${f(m group 1)}${m.matched.substring(m end 1)}")
res2: String = <:123:> 456 blah 345qq

您可以更加努力地插入组1前面匹配的内容,具体取决于模式。

跟随在家:

scala> val text = "123 456 blah 345qq"
text: String = 123 456 blah 345qq

scala> val r = """(\d+)\s+\d+""" .r
r: scala.util.matching.Regex = (\d+)\s+\d+

scala> def f(s: String) = s"<:$s:>"
f: (s: String)String