ruth23454
ruth23454

Reputation: 57

How to convert string to a table?

I have this string text:

text = "hotkey=F4,value=,autoSend=false, hotkey=Shift+F9,value=,autoSend=false, hotkey=F5,value=,autoSend=false"

and I would like to convert it to a table like this one:

local table = {
    {hotkey='F4', value=nil, autoSend=false};
    {hotkey='Shift+F9', value=nil, autoSend=false};
    {hotkey='F5', value=nil, autoSend=false}
}

Upvotes: 1

Views: 125

Answers (1)

wsha
wsha

Reputation: 964

This solution is limited in scope and will not cover all complexities in the input string. A simple pattern matching could generate tables you are looking for, but use this code to build a better/robust regex for the diversity of your strings

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

Regex Explanation
(): Capture string
%g: printable characters except for spaces
%w: alphanumeric characters
* : 0 or more repetitions
- : 0 or more lazy repetitions

Upvotes: 1

Related Questions