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

时间:2013-11-11 13:45:32

标签: string lua lua-patterns

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

我有以下字符串:

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的优点,如果我添加一个冗长的函数来做一些如此微不足道的事情,它就会反对我。

3 个答案:

答案 0 :(得分:16)

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

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

测试:

;

输出:

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

答案 1 :(得分:0)

只需将*更改为+即可。

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

魔术字符*表示0或更多的出现,所以当lua遇到','时,lua认为它是一个空字符串,表示[^;]不存在。

答案 2 :(得分:-1)

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