如何在Kotlin正则表达式中使用反向引用?

时间:2018-10-17 16:02:07

标签: regex kotlin

我正尝试在kotlin中使用带有反向引用的正则表达式以以下方式替换String的占位符:

  

来源:“这是一个%s,带有%02d”

     

目标:“这是一个,其中<02d />都是”

因此,我正在寻找类似的内容,但是语法正确:

private fun escapePlaceHolders(text: String): String {
    return """%([^ ]+?)""".toRegex().replace(text, "<\1/>")
}

显然,此代码甚至无法编译,更不用说工作了。问题是,我完全不知道如何在替换函数中使用反向引用。

2 个答案:

答案 0 :(得分:4)

您可以使用

val text = "This is a %s with %02d whatever"
val rx = """%(\d*[a-z])""".toRegex()
println(text.replace(rx, "<$1/>")) // => This is a <s/> with <02d/> whatever

请参见Kotlin demo

详细信息

  • %-一个%字符
  • (\d*[a-z])-第1组(在替换模式中后来称为$1):
    • \d*-0位数以上
    • [a-z]-小写的ASCII字母。

随意调整模式以适应您的输入,想法保持不变。

答案 1 :(得分:4)

最简单的方法是Wiktor Stribiżew described in the accepted answer

如果您不仅需要参考引用,还可以随意转换匹配项以替换替换项,则replace overload带有签名:

fun CharSequence.replace(regex: Regex, transform: (MatchResult) -> CharSequence): String

它可以如下使用:

"""%([^ ]+)""".toRegex().replace(text) { "<${it.groupValues[1]}/>" }