【问题标题】:Split a string by a character in Lua在 Lua 中按字符拆分字符串
【发布时间】:2016-08-25 18:19:38
【问题描述】:

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

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

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

【问题讨论】:

标签: split lua redis


【解决方案1】:

使用模式匹配:

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

注意-是魔术字符,所以必须用%转义。

【讨论】:

  • local a, b = string.match("ABC-DEF", "(.*)%-(.*)") 将在 redis lua 中生成 a="ABC"b="DEF"
【解决方案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

【讨论】:

    猜你喜欢
    • 2010-11-28
    • 2018-06-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-16
    • 1970-01-01
    • 2012-04-20
    • 1970-01-01
    相关资源
    最近更新 更多