我有类似于"ABC-DEF"
的字符串,我需要按照"-"
字符将其分割,并将每个部分分配给一个变量。在Ruby中,我会这样做:
a, b = "ABC-DEF".split('-')
显然,Lua没有这样简单的方法。经过一番搜索,我找不到一个简短明了的方法来实现我想要的功能。我提到我是Lua的新手,并且我需要在Redis脚本中使用它(所以它应该很小,如果可能的话只有一行代码)。
我有类似于"ABC-DEF"
的字符串,我需要按照"-"
字符将其分割,并将每个部分分配给一个变量。在Ruby中,我会这样做:
a, b = "ABC-DEF".split('-')
显然,Lua没有这样简单的方法。经过一番搜索,我找不到一个简短明了的方法来实现我想要的功能。我提到我是Lua的新手,并且我需要在Redis脚本中使用它(所以它应该很小,如果可能的话只有一行代码)。
使用模式匹配:
a, b = string.match("ABC-DEF", "(.*)%-(.*)")
-
是一个特殊字符,因此必须使用 %
进行转义。local a, b = string.match("ABC-DEF", "(.*)%-(.*)")
将会返回 a="ABC"
和 b="DEF"
。 - Kanagavelu Sugumar虽然您可以按照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