在Lua中通过一个字符拆分字符串

3

我有类似于"ABC-DEF"的字符串,我需要按照"-"字符将其分割,并将每个部分分配给一个变量。在Ruby中,我会这样做:

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

显然,Lua没有这样简单的方法。经过一番搜索,我找不到一个简短明了的方法来实现我想要的功能。我提到我是Lua的新手,并且我需要在Redis脚本中使用它(所以它应该很小,如果可能的话只有一行代码)。


请提供更多上下文或详细信息,以便我能够准确地翻译您的请求。 - Kanagavelu Sugumar
1
http://lua-users.org/wiki/SplitJoin - Kanagavelu Sugumar
2个回答

11

使用模式匹配:

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

请注意,- 是一个特殊字符,因此必须使用 % 进行转义。

在 Redis Lua 中,local a, b = string.match("ABC-DEF", "(.*)%-(.*)") 将会返回 a="ABC"b="DEF" - Kanagavelu Sugumar

2

虽然您可以按照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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接