我正在尝试替换以下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+
-一个或多个非空白字符