如何在Jsonnet中实现正则字符串替换并解决局部变量赋值报错?
问题原因说明
你遇到的Not a binary operator: =报错,核心原因是 Jsonnet 属于纯函数式声明语言,所有变量定义后均不可变,不支持可变状态赋值,因此你尝试修改已定义的replaceNext变量的写法不符合Jsonnet语法规则。
解决方案
方案1:直接使用标准库正则替换函数(推荐)
Jsonnet v0.18.0及以上版本的标准库已经内置了正则全局替换函数std.regexReplaceAll,完全匹配你需要的类sed正则替换能力,不需要自己手动实现字符串拆分逻辑,你的需求可以一行代码完成:
local replaceKey(str) = std.regexReplaceAll(str, 'key="[^"]*"', 'key="myNewValue"');
调用示例:replaceKey('other="val" key="oldValue" test="123"') 会返回 other="val" key="myNewValue" test="123"
方案2:兼容旧版本Jsonnet的手动实现
如果你使用的是低于v0.18.0的旧版本,没有内置正则函数,可以用std.foldl携带遍历状态的方式实现你的拆分替换逻辑,避免可变变量:
local replaceKey(str) = ( local splitParts = std.split(str, '"'); // foldl携带两个状态:是否下一段要替换、已经处理完的片段数组 local foldResult = std.foldl( function(acc, x) local replaceNext = acc[0]; local processed = acc[1]; if replaceNext then [false, processed + ["myNewValue"]] else if std.endsWith(x, "key=") then [true, processed + [x]] else [false, processed + [x]], splitParts, [false, []] // 初始状态:不需要替换、处理片段为空 ); std.join('"', foldResult[1]) );
内容的提问来源于stack exchange,提问作者Heiko Finzel
相关产品推荐
相关产品推荐

