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

标签 regex kotlin

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

Source: "This is a %s with %02d whatever"

Target: "This is a <s/> with <02d/> whatever"



所以我正在寻找这样的东西,但语法正确,当然:
private fun escapePlaceHolders(text: String): String {
    return """%([^ ]+?)""".toRegex().replace(text, "<\1/>")
}

显然,这段代码甚至不能编译,更不用说工作了。问题是我不知道如何在替换函数中使用反向引用,如果可以的话。

最佳答案

您可以使用

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
如果您需要在替换之前对组值执行额外操作,也就是“将反向引用传递给函数”(例如,将值大写或小写),您可以使用 .replace 的重载使用 transform 的方法争论:
// To get the same result as above, i.e. wrap Group 1 with < >:
println(rx.replace(text) { "<${it.groupValues[1].uppercase()}>" })
// =>  This is a <S> with <02D> whatever
// If you just want to turn Group 1 value to upper case:
println(rx.replace(text) { it.groupValues[1].uppercase() })
// => This is a S with 02D whatever
Kotlin demo #1Kotlin demo #2 .
详情
  • % - 一个 %字符
  • (\d*[a-z]) - 第 1 组(后来用替换模式中的 $1 引用):
  • \d* - 0+ 位
  • [a-z] - 一个小写的 ASCII 字母。


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

    关于regex - 如何在 kotlin 正则表达式中使用反向引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52859120/

    相关文章:

    testing - 如何在 Kotlin 中模拟和验证 Lambda 表达式?

    android - 应用程序崩溃/停止并显示空白字段。我想显示错误,请输入详细信息,字段为空

    gradle - 插件如何提供扩展任务?

    java - RowFilter.regexFilter 多列

    python - 我怀疑 re.match 弄乱了控制流

    php - 无法发送 2 个字符的输入

    regex - 为什么非贪婪量词有时在 Oracle 正则表达式中不起作用?

    regex - Ruby 正则表达式从仅包含一个数字的字符串中提取数字并修剪逗号后的部分

    kotlin - 在不使用正则表达式的情况下有效地将 Kotlin 字符串分解为固定长度的子字符串

    java - 如何向 JavaFX 图表添加辅助图例?