2016-04-30 37 views
1

我有类似"ABC-DEF"的字符串,我需要将它们分开"-"字符,并将这两个部分分配给一个变量。在Ruby中,我会这样做:在Lua中用字符分割字符串

a, b = "ABC-DEF".split('-') 

显然,Lua并没有这么简单的方法。经过一番挖掘,我找不到一个简短而简洁的方式来实现我所追求的目标。我提到我是Lua的一名完全新手,我需要在Redis的脚本中使用它(所以它应该确实很小,如果可能的话,它是一个班轮)。

+0

重复https://stackoverflow.com/questions/1426954/split-string-in-lua ..? –

+1

http://lua-users.org/wiki/SplitJoin –

回答

7

使用模式匹配:

a, b = string.match("ABC-DEF", "(.*)%-(.*)") 

注意-是一个神奇的人物,所以它必须与%转义。

+0

'local a,b = string.match(“ABC-DEF”,“(。*)% - (。*)”)'会导致a =在redis lua中的“ABC”'和'b =“DEF”'。 –

1

虽然你当然可以按照俞皓的建议去做,但如果你需要一个可以像Python一样简单使用的通用库,下面的代码将为你提供这个。它也会给你一个gsplit()迭代器。

local unpack = table.unpack or unpack 

-------------------------------------------------------------------------------- 
-- Escape special pattern characters in string to be treated as simple characters 
-------------------------------------------------------------------------------- 

local 
function escape_magic(s) 
    local MAGIC_CHARS_SET = '[()%%.[^$%]*+%-?]' 
    if s == nil then return end 
    return (s:gsub(MAGIC_CHARS_SET,'%%%1')) 
end 

-------------------------------------------------------------------------------- 
-- Returns an iterator to split a string on the given delimiter (comma by default) 
-------------------------------------------------------------------------------- 

function string:gsplit(delimiter) 
    delimiter = delimiter or ','   --default delimiter is comma 
    if self:sub(-#delimiter) ~= delimiter then self = self .. delimiter end 
    return self:gmatch('(.-)'..escape_magic(delimiter)) 
end 

-------------------------------------------------------------------------------- 
-- Split a string on the given delimiter (comma by default) 
-------------------------------------------------------------------------------- 

function string:split(delimiter,tabled) 
    tabled = tabled or false    --default is unpacked 
    local ans = {} 
    for item in self:gsplit(delimiter) do 
    ans[ #ans+1 ] = item 
    end 
    if tabled then return ans end 
    return unpack(ans) 
end