用regexp替换yaml结构中的版本



我正在尝试替换以下yaml结构中版本属性的值。

我之所以使用regex而不是解析yaml,是因为我需要再次将其写回。如果我解析它,然后把它写回来,它就会失去现有的格式。

environments:
local:
values:
- kubeContext: default
- surfScreenshotter:
installed: false
version: 0
- whoamiMn:
installed: false
version: 0
dev:
values:
- kubeContext: nuc
- surfScreenshotter:
installed: false
version: 0
- whoamiMn:
installed: false
version: 0

我的科特林代码

val regex = """environments:
|.*
|  $environment:
|    values:
|.*
|      - $projectName:
|.*
| {10}version: (S+)
""".trimMargin().toRegex(MULTILINE)
val updatedHelmfile = regex.replaceFirst(helmfileContent, version)

$environment可以是";本地";或";dev";并且projectName可以是";surfScreenshoter";或";whoamiMn";。

没有匹配的内容。有人知道怎么做吗?

您可以依靠缩进来确保您位于文本块的正确部分,并将版本之前的整个部分捕获到捕获组中:

val regex = """(environments:
|(?:Rh{2}.*)*?Rh{2}$environment:
|(?:Rh{4}.*)*?Rh{6}-h*$projectName:
|(?:Rh{10}.*)*?Rh{10}
|version:h*)S+
""".trimMargin().toRegex(RegexOption.COMMENTS)

然后,您需要确保在替换模式中使用$1恢复组1内容:

val updatedHelmfile = regex.replaceFirst(helmfileContent, "$1" + version)

请参阅regex演示和Kotlin演示。

详细信息

  • (environments:-组1开始和environments:字符串
  • (?:Rh{2}.*)*?Rh{2}dev:-出现零次或多次(尽可能少(换行符,后跟两个水平空白,然后是行的其余部分,然后是换行符、两个水平空格和dev:字符串
  • (?:Rh{4}.*)*?Rh{6}-h*whoamiMn:-出现零次或多次(尽可能少(换行符,后跟四个水平空白,然后是行的其余部分,然后是换行符、六个水平空白和-+0或更多空格,然后是whoamiMn:字符串
  • (?:Rh{10}.*)*?Rh{10}-出现零次或多次(尽可能少(换行,然后是十个水平空白,然后是行的其余部分,然后是换行,十个水平空格
  • version:h*)-version:,0个或更多空格,组1末尾
  • S+-一个或多个非空白字符

最新更新