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

Nic*_* M. 7 string lua lua-patterns

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

我有以下字符串:

local s = "one;two;;four"
Run Code Online (Sandbox Code Playgroud)

我想分开它";".我想最终得到{ "one", "two", "", "four" }回报.

所以我试着这样做:

local s = "one;two;;four"

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

但结果(words表)是{ "one", "", "two", "", "", "four", "" }.那肯定不是我想要的.

现在,正如我所说,这里有一些关于分裂字符串的讨论,但它们中有"冗长"的功能,我需要一些简洁的东西.我需要这个代码用于一个程序,在那里我展示了Lua的优点,如果我添加一个冗长的函数来做一些如此微不足道的事情,它将违背我.

Yu *_*Hao 16

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

通过增加一个额外;的字符串的结尾,字符串现在变成了"one;two;;four;",一切你想捕捉可以使用模式"([^;]*);"匹配:什么也没;后跟一个;(贪婪).

测试:

for n, w in ipairs(words) do
    print(n .. ": " .. w)
end
Run Code Online (Sandbox Code Playgroud)

输出:

1: one
2: two
3:
4: four
Run Code Online (Sandbox Code Playgroud)

  • @NiccoloM.请记住`*`匹配零或更多,空字符串我在字符串`1 $中标记`$`;两个$; $;四$`也是匹配. (3认同)
  • @NiccoloM。因为 `*` 是贪婪的,它会尽可能地尝试匹配,匹配零个或多个的非贪婪版本是 `-`。 (2认同)
  • 值得注意的是,LUA 模式实际上并不是正则表达式,您会注意到“标准”正则表达式实现和 LUA 模式的运行方式之间存在许多差异。 (2认同)