【问题标题】:Split a string using string.gmatch() in Lua在 Lua 中使用 string.gmatch() 分割字符串
【发布时间】:2013-11-23 08:19:39
【问题描述】:

这里有一些讨论和实用函数,用于拆分字符串,但我需要一个临时单线来完成一项非常简单的任务。

我有以下字符串:

local s = "one;two;;four"

我想在";" 上拆分它。我想,最终,去得到{ "one", "two", "", "four" }作为回报。

所以我尝试这样做:

local s = "one;two;;four"

local words = {}
for w in s:gmatch("([^;]*)") do table.insert(words, w) end

但是结果(words 表)是{ "one", "", "two", "", "", "four", "" }。这当然不是我想要的。

现在,正如我所说,这里有一些关于拆分字符串的讨论,但它们中有“冗长”的功能,我需要一些简洁的东西。我需要这个代码来展示我展示 Lua 优点的程序,如果我添加一个冗长的函数来做一些如此微不足道的事情,它就会对我不利。

【问题讨论】:

  • [^;]* 非常乐意匹配零分号。因此,lua 每次到达分隔符时都会匹配零个分号。您可以使用 "[^;]+" 来获得更好的结果,但是 lua-users wiki 的 lua-users.org/wiki/SplitJoin 页面在讨论拆分字符串时运行的时间与它一样长。

标签: string lua lua-patterns


【解决方案1】:
local s = "one;two;;four"
local words = {}
for w in (s .. ";"):gmatch("([^;]*);") do 
    table.insert(words, w) 
end

通过在字符串末尾添加一个额外的;,字符串现在变为"one;two;;four;",您想要捕获的所有内容都可以使用"([^;]*);" 模式来匹配:任何不是; 的内容后跟@987654326 @(贪婪)。

测试:

for n, w in ipairs(words) do
    print(n .. ": " .. w)
end

输出:

1: one
2: two
3:
4: four

【讨论】:

  • 哇,谢谢。您的解决方案完美运行! (我还没有结束这个问题:如果有人可以向我解释为什么我的原始代码返回虚假的空字符串,我将不胜感激。)
  • @NiccoloM。请记住* 匹配零个或多个,我在字符串one$;two$;$;four$ 中标记$ 的空字符串也是匹配的。
  • 但是one$;$two$;$;$fo$ur$ 呢?为什么零匹配只在 ; 之前?为什么不在;之后,每两个字母之间呢?
  • @NiccoloM。因为*是贪婪的,它会尽可能长地尝试匹配,匹配零个或多个的非贪婪版本是-
  • 值得注意的是,LUA 模式实际上并不是正则表达式,您会注意到“标准”正则表达式实现与 LUA 模式的操作方式之间存在许多差异。
【解决方案2】:
function split(str,sep)
    local array = {}
    local reg = string.format("([^%s]+)",sep)
    for mem in string.gmatch(str,reg) do
        table.insert(array, mem)
    end
    return array
end
local s = "one;two;;four"
local array = split(s,";")

for n, w in ipairs(array) do
    print(n .. ": " .. w)
end

结果:

1:一个

2:两个

3:4

【讨论】:

  • 你的答案应该包含对你的代码的解释和它如何解决问题的描述。
  • 这不能像 OP 预期的那样工作,因为;; 之间的空字符串没有被捕获。
  • 我明白了。现在我明白你的意思了。
【解决方案3】:

只需将 * 更改为 + 即可。

local s = "one;two;;four"
local words = {}
for w in s:gmatch("([^;]+)") do 
    table.insert(words, w) 
    print(w)
end

魔术字符*代表0个或多个出现,所以遇到','时,lua将其视为不存在[^;]的空字符串。

对不起,我的粗心,words[3] 应该是一个空字符串,但是当我在 lua5.4 解释器中运行原始代码时,一切正常。

code here

running result here (由于缺乏声誉,我不得不放链接)

【讨论】:

  • 这并没有给出 OP 想要的输出,他们想要索引 3 处的空字符串。{ "one", "two", "", "four" }
  • @Nifim sry,我没有仔细阅读问题。但是当我使用lua5.4解释器时,原始代码突然起作用了!?
猜你喜欢
  • 2017-05-18
  • 2020-07-18
  • 1970-01-01
  • 2014-07-14
  • 1970-01-01
  • 1970-01-01
  • 2011-03-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多