List 有没有一种方法可以像拆分Python列表obj一样拆分Lua表

List 有没有一种方法可以像拆分Python列表obj一样拆分Lua表,list,lua,lua-table,List,Lua,Lua Table,我正在构建一个库,我需要拆分一个字符串,字符串如下 'PROTOCAL:ROOM:USER:MESSAGE:MESSAGE_ID:TIME_FLOAT' 例如,在python中,我可以将其转换为一个列表,然后拆分该列表 string='PROTOCAL:ROOM:USER:MESSAGE:MESSAGE\u ID:TIME\u FLOAT' string=string.split(“:”,1) strlst=list() 对于字符串中的stri:strlst.append(stri) 现在有

我正在构建一个库,我需要拆分一个字符串,字符串如下

'PROTOCAL:ROOM:USER:MESSAGE:MESSAGE_ID:TIME_FLOAT'
例如,在python中,我可以将其转换为一个列表,然后拆分该列表

string='PROTOCAL:ROOM:USER:MESSAGE:MESSAGE\u ID:TIME\u FLOAT'
string=string.split(“:”,1)
strlst=list()
对于字符串中的stri:strlst.append(stri)
现在有了这个列表,我可以这样拼接它

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

这可以在Lua中完成。

请注意,对于长度为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表,索引从
1
开始,而不是
0
,您可以使用
table.unpack
对小表进行切片。因此,您将有:

a1={table.unpack(strlist,1,0)}——空表
a2={table.unpack(strlist,1,1)}——只是包装在表中的第一个元素
b1={table.unpack(strlist,1,#list)}——整个表的副本
b2={table.unpack(strlist,2,#list)}——除了第一个元素之外的所有元素
c=strlist[1]
table.unpack
在Lua5.2中起作用,它在Lua5.1中只是
unpack


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

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

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

a
b
c
的最终结果是什么?使用c变量,我可以得到列表中的第一个元素。使用b变量,我可以得到除第一个元素以外的所有元素,依此类推。
split
已经为您提供了一个列表。制作另一个列表并将所有项目从一个添加到另一个是不必要的。此外,
strlst[:0]
是一个空列表,
strlst[0:
是整个
strlst
的副本。您可能需要查看如何分割和列出切片工作,因为您所做的工作远远超出了需要。