Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 如何在kotlin正则表达式中使用反向引用?_Regex_Kotlin - Fatal编程技术网

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

Regex 如何在kotlin正则表达式中使用反向引用?,regex,kotlin,Regex,Kotlin,我尝试在kotlin中使用带反向引用的正则表达式,以以下方式替换字符串的占位符: 来源:“这是一个带有%02d的%s” 目标:“这是一个什么都有” 所以我在寻找这样的东西,当然,要有正确的语法: private fun escapePlaceHolders(text: String): String { return """%([^ ]+?)""".toRegex().replace(text, "<\1/>") } private-fun转义placeholder(文本:

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

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

目标:“这是一个什么都有”

所以我在寻找这样的东西,当然,要有正确的语法:

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
    %
    字符
  • (\d*[a-z])
    -第1组(后面用替换模式中的
    $1
    来指):
    • \d*
      -0+位
    • [a-z]
      -一个小写ASCII字母

请根据您的输入随意调整模式,想法保持不变。

最简单的方法是什么

如果您不仅需要引用匹配项,还需要任意转换匹配项以进行替换,那么有一个强大的替代方案,即带有签名的:

fun CharSequence.replace(regex:regex,transform:()->CharSequence):字符串

它可以按如下方式使用:

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

非常感谢。我的正则表达式也错了。它在%s中运行正常,但由于某些原因在%02d中失败。@FranMarzoa您的
([^]+?)
只匹配了一个非空格字符。您可以尝试使用
([^]+)
。但我怀疑它会匹配得太多。我想,如果你在它后面加一个空格,它就不应该匹配了。但无论如何,你的工作非常完美,而且非常简单,所以非常感谢你。好吧,为了测试起见,它在没有测试的情况下也能工作?正如你所建议的。当然,正则表达式末尾的延迟量化模式总是匹配最少数量的字符:
*?
/
不匹配任何字符,
+?
匹配一个字符。