Regex 如何在kotlin正则表达式中使用反向引用?
我尝试在kotlin中使用带反向引用的正则表达式,以以下方式替换字符串的占位符: 来源:“这是一个带有%02d的%s” 目标:“这是一个什么都有” 所以我在寻找这样的东西,当然,要有正确的语法:Regex 如何在kotlin正则表达式中使用反向引用?,regex,kotlin,Regex,Kotlin,我尝试在kotlin中使用带反向引用的正则表达式,以以下方式替换字符串的占位符: 来源:“这是一个带有%02d的%s” 目标:“这是一个什么都有” 所以我在寻找这样的东西,当然,要有正确的语法: private fun escapePlaceHolders(text: String): String { return """%([^ ]+?)""".toRegex().replace(text, "<\1/>") } private-fun转义placeholder(文本:
private fun escapePlaceHolders(text: String): String {
return """%([^ ]+?)""".toRegex().replace(text, "<\1/>")
}
private-fun转义placeholder(文本:String):String{
返回“%”([^]+?)“”。toRegex()。替换(文本““”)
}
很明显,这段代码甚至不能编译,更不用说工作了。问题是,如果可以的话,我不知道如何在replace函数中使用back引用。您可以使用
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
val text=“这是一个带有%02d的%s”
val rx=“”%(\d*[a-z])”。toRegex()
println(text.replace(rx,“”)/>这是一个带有任何内容的
见
详细信息
-a%
字符%
-第1组(后面用替换模式中的(\d*[a-z])
来指):$1
-0+位\d*
-一个小写ASCII字母[a-z]
请根据您的输入随意调整模式,想法保持不变。最简单的方法是什么 如果您不仅需要引用匹配项,还需要任意转换匹配项以进行替换,那么有一个强大的替代方案,即带有签名的:
fun CharSequence.replace(regex:regex,transform:()->CharSequence):字符串
它可以按如下方式使用:
"""%([^ ]+)""".toRegex().replace(text) { "<${it.groupValues[1]}/>" }
“”“%([^]+)”“”.toRegex().replace(text){”“}
非常感谢。我的正则表达式也错了。它在%s中运行正常,但由于某些原因在%02d中失败。@FranMarzoa您的([^]+?)
只匹配了一个非空格字符。您可以尝试使用([^]+)
。但我怀疑它会匹配得太多。我想,如果你在它后面加一个空格,它就不应该匹配了。但无论如何,你的工作非常完美,而且非常简单,所以非常感谢你。好吧,为了测试起见,它在没有测试的情况下也能工作?正如你所建议的。当然,正则表达式末尾的延迟量化模式总是匹配最少数量的字符:*?
/?
不匹配任何字符,+?
匹配一个字符。