String 如何将字符串转换为表?
我有以下字符串文本: 我想把它转换成这样一个表:String 如何将字符串转换为表?,string,lua,lua-table,String,Lua,Lua Table,我有以下字符串文本: 我想把它转换成这样一个表: local table = { {hotkey='F4', value=nil, autoSend=false}; {hotkey='Shift+F9', value=nil, autoSend=false}; {hotkey='F5', value=nil, autoSend=false} } 此解决方案的范围有限,无法涵盖输入字符串中的所有复杂性。一个简单的模式匹配可以生成您正在寻找的表,但是使用此代码可以为字符串
local table = {
{hotkey='F4', value=nil, autoSend=false};
{hotkey='Shift+F9', value=nil, autoSend=false};
{hotkey='F5', value=nil, autoSend=false}
}
此解决方案的范围有限,无法涵盖输入字符串中的所有复杂性。一个简单的模式匹配可以生成您正在寻找的表,但是使用此代码可以为字符串的多样性构建一个更好/更健壮的正则表达式
s = "hotkey=F4,value=,autoSend=false, hotkey=Shift+F9,value=,autoSend=false, hotkey=F5,value=,autoSend=false"
local words = {}
for w in s:gmatch("(hotkey=%g-,value=%g-,autoSend=%w*)") do
-- Split string in more managebale parts
-- i-g w = 'hotkey=F4,value=,autoSend=false, hotkey=Shift+F9'
-- Extract indivisual k,v pairs and insert into table as desired
local _hotkey = string.match(w,"hotkey=(%g-),")
local _value = string.match(w,"value=(%g-),")
local _autoSend = string.match(w,"autoSend=(%w+)")
table.insert(words,{hotkey=_hotkey, value=_value, autoSend=_autoSend})
end
for _, w in ipairs(words) do
for k, v in pairs(w) do
print(k .. ':' .. v)
end
end
正则表达式解释():捕获字符串
%g:除空格外的可打印字符
%w:字母数字字符
*:0次或多次重复
-:0或更多惰性重复
谢谢,此代码不检查“value”中的空格,例如“value=two words”我通过将模式值更改为这一个值=([^=]*)来修复它。我注意到此模式存在一个问题“([^=]*)”,例如,如果我将值与“=”like“value=one=two”一起使用,则模式会失败。显然,regex范围有一些限制。您应该避免使用长/复杂的正则表达式,因为这会使调试变得困难(对于将来处理您的正则表达式的人)。话虽如此:尝试只操纵(^*=*,$i-g:value=plus+two words=3),一旦提取了简单字符串,就可以根据需要构建表/数组。您是指“F4”、“Shift+F9”和“F5”-字符串吗?
s = "hotkey=F4,value=,autoSend=false, hotkey=Shift+F9,value=,autoSend=false, hotkey=F5,value=,autoSend=false"
local words = {}
for w in s:gmatch("(hotkey=%g-,value=%g-,autoSend=%w*)") do
-- Split string in more managebale parts
-- i-g w = 'hotkey=F4,value=,autoSend=false, hotkey=Shift+F9'
-- Extract indivisual k,v pairs and insert into table as desired
local _hotkey = string.match(w,"hotkey=(%g-),")
local _value = string.match(w,"value=(%g-),")
local _autoSend = string.match(w,"autoSend=(%w+)")
table.insert(words,{hotkey=_hotkey, value=_value, autoSend=_autoSend})
end
for _, w in ipairs(words) do
for k, v in pairs(w) do
print(k .. ':' .. v)
end
end