regex - 如何在 kotlin 正则表达式中使用反向引用?
问题描述
我正在尝试在 kotlin 中使用带有反向引用的正则表达式以下列方式替换字符串的占位符:
来源:“这是一个带有 %02d 的 %s”
目标:“这是一个带有 <02d/> 的 <s/>”
所以我正在寻找这样的东西,但语法正确,当然:
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
细节
%
- 一个%
字符(\d*[a-z])
- 第 1 组(后来称为$1
替换模式):\d*
- 0+ 位数[a-z]
- 一个小写的 ASCII 字母。
随意调整模式以适应您的输入,想法保持不变。
推荐阅读
- javascript - 退出 Java 脚本中的应用程序?
- javascript - 将字符串与变量和转义字符连接起来
- json - 选择数组的元素并就地更新它
- jupyter-notebook - Anaconda Navigator Jupyter 和 Spyder 安装成功后无法启动
- c# - 如何将列表值的组合字符串发布到消息框
- android - 与分页库合并时,recyclerview 适配器内的 [android-architecture-components]onClickListener 工作异常
- javascript - JavaScript ReferenceError:按钮未定义
- r - 对聚类树状图的调整
- javascript - 如何使用 Next.js 在每一侧添加组件?
- javascript - 获取一个变量内的数字总和