Lua中按字符拆分字符串

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

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

显然,Lua没有这样简单的方法。经过一番调查,我没有找到一种简短而简洁的方式来实现我想要的结果。我提到我是Lua的一个完全新手,我需要在Redis脚本中使用它(所以它确实应该很小,如果可能的话,是一个一行代码的)。

点赞
用户1009479
用户1009479

使用模式匹配:

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

注意,-是一个特殊字符,因此必须用转义。

2016-04-30 17:18:00
用户3735873
用户3735873

虽然您可以像余浩建议的那样进行操作,但如果您需要一个通用的库,您可以使用 Python 类似的简单性,下面的代码将为您提供此功能。它还将为您提供一个 gsplit() 迭代器。

local unpack = table.unpack or unpack

--------------------------------------------------------------------------------
-- 转义特殊模式字符,以便将其视为简单字符
--------------------------------------------------------------------------------

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

--------------------------------------------------------------------------------
-- 返回使用给定分隔符(默认为逗号)拆分字符串的迭代器
--------------------------------------------------------------------------------

function string:gsplit(delimiter)
  delimiter = delimiter or ','          --默认分隔符为逗号
  if self:sub(-#delimiter) ~= delimiter then self = self .. delimiter end
  return self:gmatch('(.-)'..escape_magic(delimiter))
end

--------------------------------------------------------------------------------
-- 使用给定分隔符拆分字符串(默认为逗号)
--------------------------------------------------------------------------------

function string:split(delimiter,tabled)
  tabled = tabled or false              --默认为不打包
  local ans = {}
  for item in self:gsplit(delimiter) do
    ans[ #ans+1 ] = item
  end
  if tabled then return ans end
  return unpack(ans)
end
2016-04-30 18:33:42