抱歉,如果标题不清楚,如果您建议更好的标题,我可以更改它,问题是:
我有这样的字符串
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惯用方式来实现这个目标?...谢谢!!!。
答案 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