使用string.gmatch()在Lua中拆分字符串。

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

我有以下字符串:

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 优点的程序,如果我添加一个这样的函数来完成如此微不足道的任务,那就会反对我。

点赞
用户1009479
用户1009479
local s = "one;two;;four"
local words = {}
for w in (s .. ";"):gmatch("([^;]*);") do
    table.insert(words, w)
end

通过在字符串末尾添加一个额外的 ;,使得字符串变成 "one;two;;four;",你想要捕获的所有内容都可以使用模式 "([^;]*);" 进行匹配:任何非 ; 的字符紧随着一个 ;(贪婪匹配)。

测试:

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

输出:

1: one
2: two
3:
4: four
2013-11-11 13:57:36
用户4021395
用户4021395
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:one

2:two

3:four

2014-11-21 02:06:49
用户14713740
用户14713740

只需将 * 更改为 + 即可。

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解释器中运行原始代码时,一切正常。

此处为代码

此处为运行结果 (由于声望不足,我只能提供链接)

2020-11-26 13:53:37