问题描述
我正在编写一个 terraform 模块,我需要在其中捕获和替换字符串中的标记。标记由 {{...}}
括起来,但我不想捕获那些匹配 {{global-...}}
的标记。
例如:
locals {
input = "Hello {{name}} this is {{global-env}}. Welcome to {{home}}."
output = replace(local.input,"/{{(.+?)}}/","{{$1-en_US}}")
}
output "output" { value = local.output }
# Actual: Hello {{name-en_US}} this is {{global-env-en_US}}. Welcome to {{home-en_US}}
# Expected: Hello {{name-en_US}} this is {{global-env}}. Welcome to {{home-en_US}}
在 C# 正则表达式中,我本可以使用负面展望:
{{(?!global-)(.+?)}}
然而,由于 terraform 及其底层 Go lang 运行时不支持环视,有什么替代方案?位于 terraform 模块中也不允许我遍历每个匹配项并测试捕获组。
解决方法
您可以通过使用第二个替换从第一个替换后以 -en_US
开头并以 global-
结尾的占位符中删除 -en_US
来解决这个问题:
output = replace(replace(local.input,"/{{(.+?)}}/","{{$1-en_US}}"),"({{global-.+?)-en_US}}","$1}}")