2016-04-30 8 views
1

私は"ABC-DEF"のような文字列を持っており、それらを"-"文字で分割し、それぞれの部分を変数に割り当てる必要があります。 Rubyでは、私は次のようにします:ルアの文字で文字列を分割する

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

明らかに、Luaは簡単な方法はありません。いくつかの掘削の後で、私は後に何を達成するための簡潔で簡潔な方法を見つけることができませんでした。私はLuaの完全な初心者であり、私はRedisのスクリプトでそれを使用する必要があると言います(実際には、できるだけ小さく、1つのライナーにする必要があります)。

+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

'ローカルa、b = string.match(" ABC-DEF "、"(。*)% - (。*) ")'結果はa = "ABC"と "b =" DEF "を赤字に変換します。 –

1

Yu Haoの示唆によれば、確かにそれを行うことはできますが、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