Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Lua中使用string.gmatch()拆分字符串_String_Lua_Lua Patterns - Fatal编程技术网

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

在Lua中使用string.gmatch()拆分字符串,string,lua,lua-patterns,String,Lua,Lua Patterns,这里有一些关于拆分字符串的讨论和实用函数,但我需要一个特别的单行程序来完成一项非常简单的任务 我有以下字符串: local s = "one;two;;four" 我想在“;”上拆分它。我希望最终得到{“一”、“二”、“四”}作为回报 所以我试着做: local s = "one;two;;four" local words = {} for w in s:gmatch("([^;]*)") do table.insert(words, w) end 但是结果(单词表)是{“一”,“二”,

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

我有以下字符串:

local s = "one;two;;four"
我想在
“;”
上拆分它。我希望最终得到
{“一”、“二”、“四”}
作为回报

所以我试着做:

local s = "one;two;;four"

local words = {}
for w in s:gmatch("([^;]*)") do table.insert(words, w) end
但是结果(单词
表)是
{“一”,“二”,“四”,“四”}
。那当然不是我想要的

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

local s = "one;two;;four"
local words = {}
for w in (s .. ";"):gmatch("([^;]*);") do 
    table.insert(words, w) 
end
通过添加一个额外的
在字符串末尾,字符串现在变成
“1;2;;4;”
,您想要捕获的所有内容都可以使用模式
”([^;]*);“
来匹配:任何不
的内容后跟一个
(贪婪)

测试:

输出:

1: one
2: two
3:
4: four
结果:

1:1

2:2


3:四个

只要把*改成+就行了

local s=“一;二;四”
本地单词={}
对于s中的w:gmatch(“([^;]+)”)do
表.插入(字,w)
打印(w)
结束
魔术字符*表示0个或多个出现,因此当它遇到“,”时,lua将其视为[^;]不存在的空字符串

很抱歉我的粗心大意,
单词[3]
应该是一个空字符串,但是当我在lua5.4解释器中运行原始代码时,一切正常


(由于缺乏声誉,我不得不添加链接)

哇,谢谢。您的解决方案非常有效!(我还不想结束这个问题:如果有人能向我解释为什么我的原始代码返回虚假的空字符串,我将不胜感激。)@NiccoloM。请记住,
*
匹配零个或多个空字符串,我在字符串
one$中标记了
$
;两美元;四美元也是一个匹配项。但是一美元怎么样$两美元$fo$ur$
?为什么零匹配只在
之前?为什么它不在
之后,每两个字母之间?@NiccoloM。因为
*
是贪婪的,它会尽可能长时间地匹配,匹配零或更多的非贪婪版本是
-
。值得注意的是,LUA模式实际上不是正则表达式,您会注意到“标准”regexp实现之间的许多差异以及LUA模式的操作方式。
[^;]*
非常乐意匹配零分号。因此,lua每次到达分隔符时都匹配零分号。您可以使用“[^;]+”来获得更好的结果,但有一些原因可以说明lua users wiki页面在谈到拆分字符串时运行的时间与此相同。您的答案应该包含对代码的解释以及它如何解决问题的描述。这与OP预期的不一样,因为
之间的空字符串未被捕获。我明白了。现在我明白你的意思了。这并没有给出OP想要的输出,他们希望索引3处有一个空字符串<代码>{“一”、“二”、“四”}
@Nifim sry,我没有仔细阅读这个问题。但是当我使用lua5.4解释器时,原来的代码突然起作用了!?
1: one
2: two
3:
4: four
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