12

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

我有以下字符串:

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

4

3 回答 3

20
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-11T13:57:36.183 回答
0

只需将 * 更改为 + 即可。

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-26T13:53:37.490 回答
-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

于 2014-11-21T02:06:49.450 回答