lua sub string replace 2 pattern

由于使用nginx lua (kong gateway) 希望替换 从

{"body":"\r\n  \"username\": \"sampleUser\",\r\n  \"password\": \"samplePassword\",\r\n"}

to

{"body":"\r\n  \"username\": \"sampleUser\",\r\n  \"password\": \"***REDACTED***\",\r\n"}

username=sampleUser&password=samplePassword

username=sampleUser&password=***REDACTED***

"password" : "krghfkghkfghf"

to

"password" : "***REDACTED***"

我尝试了示例 https://stackoverflow.com/a/16638937/712063

local function replacePass(configstr, newpass)
return configstr:gsub("(%[\"password\"%]%s*=%s*)%b\"\"", "%1\"" .. newpass .. "\"")
end

但它不起作用,请问有推荐的参考资料吗?

点赞
用户4984564
用户4984564

一. 你只检查了 =

乍一看,你的测试数据似乎包含了 key:valuekey = value 两种情况,但你的匹配模式只检查了 =,把它替换成 [=:] 就可以简单解决。

二. 无法平衡引号

我不知道你期望这样做是什么效果,但 [[%b""]] 只会寻找两个 " 之间的最短字符串,与使用 [[".-"]] 没有区别。如果这正是你想要的,那么用 %b 写也没什么错。

三. 不要这样做

我不知道具体的上下文是什么,所以不确定这是不是明智的做法,但看起来这个解决方案非常脆弱。如果有其他选择,我强烈推荐考虑其他更加健壮的解决方案。

至于更好的解决方案应该如何,我不知道你的具体需求是什么。也许可以将数据标准化为一个Lua表,并以统一的方式替换 password 键?这将确保数据进行了清理,或在解析过程中发生错误时进行处理。


此外,如果你能告诉我们具体它的错误表现形式,那将更有助于我们查找问题。读别人的代码时很容易忽略错误,但知道代码的错误表现方式就可以更容易地找到问题了。


编辑:

四. 你甚至没有删除括号

你甚至没有从其他栈溢出的答案中删除 []。显然,这是不能在没有任何修改的情况下完成工作的。

2020-05-25 07:48:37
用户7504558
用户7504558
-- 定义一个表格 t,其中包含三个字符串元素
local t = {
    [[{"body":"\r\n  \"username\": \"sampleUser\",\r\n  \"password\": \"samplePassword\",\r\n"} ]],
    [[username=sampleUser&password=samplePassword]],
    [["password" : "krghfkghkfghf"]]
}

-- 定义新密码
local newpass = "***REDACTED***"

-- 遍历表格 t 中每个元素,将其中的密码部分替换为新密码 newpass
for k, example in pairs(t) do
  -- 替换 JSON 格式中的密码部分
  res = example:gsub('(password[\\" :]+)(.-)([\\"]+)', "%1" .. newpass .. "%3")
  -- 替换表单格式中的密码部分
  res = res:gsub("(password=).+", "%1" .. newpass)
  -- 打印替换后的结果
  print(res)
end

输出结果:

{"body":"\r\n  \"username\": \"sampleUser\",\r\n  \"password\": \"***REDACTED***\",\r\n"}
username=sampleUser&password=***REDACTED***
"password" : "***REDACTED***"
2020-05-25 07:49:17