我正尝试在kotlin中使用带有反向引用的正则表达式以以下方式替换String的占位符:
来源:“这是一个%s,带有%02d”
目标:“这是一个
,其中<02d />都是”
因此,我正在寻找类似的内容,但是语法正确:
private fun escapePlaceHolders(text: String): String {
return """%([^ ]+?)""".toRegex().replace(text, "<\1/>")
}
显然,此代码甚至无法编译,更不用说工作了。问题是,我完全不知道如何在替换函数中使用反向引用。
答案 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]}/>" }