lua 子字符串替换 2 模式

lua sub string replace 2 pattern

由于使用 nginx lua(kong 网关) 想更换 来自

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

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

来自

username=sampleUser&password=samplePassword

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

来自

"password" : "krghfkghkfghf"

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

我试过样品

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

它不起作用,有推荐的参考吗?

乍一看有几处不对。

1。您只检查 =

在您的测试数据中,您似乎有 key = value 以及 key : value 的情况,但您的模式仅检查=;将其替换为 [=:] 以进行简单修复。

2。你不能平衡引号

我不知道您希望它如何工作,但 [[%b""]] 只是找到两个 " 字符之间的最短字符串,就像 [[".-"]] 那样。如果那是你的意图,那么使用 %b 编写它并没有错。

3。只是不要

由于我不知道上下文,我不能说这是否真的是个坏主意,但它看起来确实是一个非常脆弱的解决方案。如果这是一个选项,我会建议考虑替代方案并使用更强大的东西。

至于更好的替代方案是什么样的,在不了解您的要求的情况下我不能说。也许将数据规范化为 Lua table 并以统一的方式替换 password 键?这将确保数据在解析过程中被清理或出错。


除此之外,如果您告诉我们如何它不起作用,将会有所帮助。阅读别人的代码时很容易错过错误,但了解代码的异常行为对实际发现问题有很大帮助。


编辑:

4。你连括号都没有去掉

您甚至没有从其他堆栈溢出答案中删除 []。显然,如果不进行任何修改,那是行不通的。

可能是这样的:

local t = {
    [[{"body":"\r\n  \"username\": \"sampleUser\",\r\n  \"password\": \"samplePassword\",\r\n"} ]],
    [[username=sampleUser&password=samplePassword]],
    [["password" : "krghfkghkfghf"]]
}

local newpass ="***REDACTED***"
for k,example in pairs(t) do
  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***"