替换多行字符串中的版本

问题描述 投票:0回答:1

我正在尝试替换文件中的图表名称版本,并构建了以下修剪过的示例。但什么都没有被取代。关于我做错了什么的任何想法?

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)
regex kotlin multiline
1个回答
0
投票

代码中的MULTILINE给出了错误而无法正常工作。可能是因为缺少一些进口但我根本不了解Kotlin。但似乎MULTILINE就像DOTALL一样,也可以启用点匹配换行符。你的正则表达式中的.*是贪婪的,所以即使我使你的正则表达式工作,它将取代你的文本中的第二个版本,因此你应该在你的正则表达式中使用非贪婪版本[\\w\\W]*?\\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]是另一种启用匹配任何字符(包括换行符)的方法。

这打印出以下输出,这是我猜你期望的,

releases:
      web-env:
        version: new version
        enabled: true
      web-app:
        enabled: true
        version: 1.39.0

Kotlin Code Demo

希望这个工作正常,让我知道任何问题。

© www.soinside.com 2019 - 2024. All rights reserved.