Lua: String.match和Regex

我有一个json输出,但不幸的是,由于我运行脚本的设备无法更新,我无法使用任何json库解析它。

根据我所得到的设备型号略有不同的输出(请注意冒号前的空格):

json_output1 = '{"var1":"result1","var2":"result2","var3":"result3","var4":"10"}'
或
json_output2 = '{"var1":"result1","var2":"result2","var3":"result3","var4":"10"}'

我找到了一种用string:match()和regex作为字符串解析的方法

var1,var2,var3,var4 = json_ouptut1:match('.+"var1" : "([^"]+)"'
               .. '.+"var2" : "([^"]+)"'
               .. '.+"var3" : "([^"]+)"'
               .. '.+"var4" : "([^"]+)"')
print(var2)
--[[ 输出
$lua main.lua
result2
--]]

这很好用,我很满意,但是它只适用于一种或另一种输出,因为冒号前有空格。

有什么想法可以让它对任何字符串都能起作用吗?

谢谢

点赞
用户7396148
用户7396148

你可以使用 %s? 来让模式查找 1 或 0 个空格。

json_output1='{ "var1" : "result1", "var2" : "result2", "var3" : "result3", "var4" : "10" }'
json_output2='{ "var1": "result1", "var2": "result2", "var3": "result3", "var4": "10" }'

var1, var2, var3, var4 = json_output1:match('.+"var1"%s?: "([^"]+)"'
               .. '.+"var2"%s?: "([^"]+)"'
               .. '.+"var3"%s?: "([^"]+)"'
               .. '.+"var4"%s?: "([^"]+)")'
print(var2)

var1, var2, var3, var4 = json_output2:match('.+"var1"%s?: "([^"]+)"'
               .. '.+"var2"%s?: "([^"]+)"'
               .. '.+"var3"%s?: "([^"]+)"'
               .. '.+"var4"%s?: "([^"]+)")'
print(var2)

这里是关于 Lua 模式的一个好资源:Understanding Lua Patterns

2021-06-29 18:24:04
用户107090
用户107090

尝试这段代码。它适用于所有输入。如有需要,请进行调整。

for k,v in json_output:gmatch('"(.-)"%s*:%s*"(.-)"') do
    print(k,v)
end

关键在于使用 %s* 来跳过任何空格,甚至是空格组。

2021-06-29 19:55:42