有没有办法可以拆分Lua表,就像Python列表obj一样

时间:2014-03-23 08:20:21

标签: list lua lua-table

我正在构建一个lib,我需要拆分一个字符串,字符串就像这样

'PROTOCAL:ROOM:USER:MESSAGE:MESSAGE_ID:TIME_FLOAT'

在python中,我可以将其转换为列表,然后拆分列表,例如

string = 'PROTOCAL:ROOM:USER:MESSAGE:MESSAGE_ID:TIME_FLOAT'
string = string.split(':', 1)
strlst = list()
for stri in string: strlst.append(stri)

现在有了这个列表,我可以像这样拼接它,

a = strlst[:0]
b = strlst[0:]
c = strlst[0]

这可以在Lua完成。

2 个答案:

答案 0 :(得分:2)

请注意,对于长度为2或更长的分隔符,以下拆分功能将失败。因此,您无法将其用作,:之类的分隔符。

function split( sInput, sSeparator )
    local tReturn = {}
    for w in sInput:gmatch( "[^"..sSeparator.."]+" ) do
        table.insert( tReturn, w )
    end
    return tReturn
end

您将按如下方式使用它:

str = 'PROTOCAL:ROOM:USER:MESSAGE:MESSAGE_ID:TIME_FLOAT'
strlist = split( str, ':' )

现在,对于lua-tables,索引从1而不是0开始,您可以使用table.unpack对小表进行切片。所以,你将拥有:

a1 = {table.unpack(strlist, 1, 0)} -- empty table
a2 = {table.unpack(strlist, 1, 1)} -- just the first element wrapped in a table
b1 = {table.unpack(strlist, 1, #list)} -- copy of the whole table
b2 = {table.unpack(strlist, 2, #list)} -- everything except first element
c = strlist[1]

table.unpack在Lua 5.2中起作用,在Lua中只有unpack 5.1)

对于较大的表格,您可能需要编写自己的shallow table copy函数。

答案 1 :(得分:0)

支持任意长度分隔符的版本:

local function split(s, sep)
    local parts, off = {}, 1
    local first, last = string.find(s, sep, off, true)
    while first do
        table.insert(parts, string.sub(s, off, first - 1))
        off = last + 1
        first, last = string.find(s, sep, off, true)
    end
    table.insert(parts, string.sub(s, off))
    return parts
end