用Lua中的一个字符拆分一个字符串

时间:2016-04-30 17:10:32

标签: split lua redis

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

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

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

2 个答案:

答案 0 :(得分:8)

使用模式匹配:

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

请注意,-是一个神奇的角色,因此必须使用%进行转义。

答案 1 :(得分: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