替换多行字符串中的版本

时间:2019-02-27 18:25:40

标签: regex kotlin multiline

我正在尝试替换文件中图表名称的版本,并构造了以下精简示例。但是什么也没有取代。关于我在做什么错的任何想法吗?

val content = """releases:
  web-env:
    version: 1.7.0
    enabled: true
  web-app:
    enabled: true
    version: 1.39.0
"""

val chart = "web-env"
val version = "new version"

val regex = "($chart:.*version: )(.*)\n".toRegex(MULTILINE)
val replace = content.replaceFirst(regex, "$1$version")
println(replace)

1 个答案:

答案 0 :(得分:0)

您在代码中的MULTILINE提供了错误并且无法正常工作。可能是由于缺少一些导入而造成的,但是我一点都不了解Kotlin。但是好像MULTILINE就像DOTALL一样也可以启用点匹配换行符。正则表达式中的.*是贪婪的,因此即使我使您的正则表达式正常工作,它也会替换文本中的第二个版本,因此您应在正则表达式[\\w\\W]*?和{{1中使用非贪婪的版本}}匹配一个或多个非空格字符,并且将匹配\\S+,尽管如果您只想精确匹配数字版本,甚至可以将其写为1.7.0

我已从您的代码中删除了\\d+(\\.\\d+)*并更正了正则表达式,这似乎工作正常。查看修改后的代码,

MULTILINE

注意:fun main(args: Array<String>) { val content = """releases: web-env: version: 1.7.0 enabled: true web-app: enabled: true version: 1.39.0 """ val chart = "web-env" val version = "new version" val regex = "($chart:[\\w\\W]*?version: )(\\S+)".toRegex() val replace = content.replaceFirst(regex, "$1$version") println(replace) } 是启用匹配任何字符(包括换行符)的另一种方法。

这会打印以下输出,这是我猜想的结果,

[\\w\\W]

Kotlin Code Demo

希望此方法工作正常,如有任何问题,请通知我。