Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String 如何将字符串转换为表?_String_Lua_Lua Table - Fatal编程技术网

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