Lua:String.match 和 Regex

问题描述

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

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

json_output1='{ "var1" : "result1","var2" : "result2","var3" : "result3","var4" : "10" }'
or
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) 
--[[ OUTOUT
$lua main.lua
result2
--]]

这项工作,我很满意,但它只适用于一个或另一个输出,因为冒号前有空格。

知道如何让这对任一字符串起作用吗?

谢谢

解决方法

您可以使用 %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,var4 = json_output2:match('.+"var1"%s?: "([^"]+)"'
               .. '.+"var2"%s?: "([^"]+)"'
               .. '.+"var3"%s?: "([^"]+)"'
               .. '.+"var4"%s?: "([^"]+)"')
print(var2)

这里有一个很好的 Lua 模式信息资源:Understanding Lua Patterns

,

试试这个代码。它适用于两个输入。根据需要进行调整。

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

这里的关键是使用 %s* 跳过任何空白运行,甚至是空白运行。