0

我正在寻找一个等价物来std.strReplace(str, from, to)替换 Jsonnet 中的部分字符串。我需要from更像一个“模式”,比如s/key="[^"]*"/key="myNewValue"/g,所以实际上我正在寻找的是一个正则表达式搜索和替换。

编辑:好的,这可能会帮助我解决我的具体问题:

local replaceKey(string) = (
  local replaceNext = false;
  std.join('"', [
  if std.endsWith(x, "key=") then
    replaceNext = true;
    x
  else if replaceNext then
    replaceNext = false;
    "myNewValue"
  else
    x
  for x in  std.split(string, '"')
  ])
);

然而,“为先前定义的局部变量设置一个新值”(replaceNext = true;)将不起作用。

Not a binary operator: =

任何想法如何做到这一点?

4

2 回答 2

0

我现在有以下解决方案:

local modifyElement(element, newValue) =
  std.join('"', std.mapWithIndex(                                                             
    function(i, str)
      if i == 1 then
        newValue
      else
        str,
    std.split(element, '"')
  ));

local splitSubstring(string, pattern) = (
  local indexes = [0] + std.findSubstr(pattern, string);
  local lenIdx = std.length(indexes);
  local lenStr = std.length(string);
  std.mapWithIndex(
    function(i, strIndex)
      std.substr(string, strIndex, 
        if lenIdx > i+1 then indexes[i+1]-strIndex
        else lenStr-strIndex),
    indexes
  )
);

local replaceValue(string, searchKey, newValue) = 
  std.join("", std.mapWithIndex(
      function(index, element)
        if index == 0 then
          element
        else
          modifyElement(element, newValue),
    splitSubstring(string, searchKey)));


// TESTCASE

local oldExpression = 'rate(kube_pod_container_status_restarts_total{namespace=~"^(ns1|ns2)$",job="expose-kubernetes-metrics"}[10m]) * 60 * 5 > 0';
{'test': replaceValue(oldExpression, "namespace=~", "^myspaces-.*$")}

但是,如果这可能更容易实现,我会很感兴趣,因为对于这样一个微不足道的任务来说,这真的很疯狂。

于 2021-11-05T17:22:52.600 回答
0

Jsonnet 目前不支持正则表达式,一些参考:

于 2021-11-05T14:30:58.350 回答