2016-04-30 36 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