在Lua中将字符串拆分为子字符串

我正在尝试使用Lua将字符串拆分为子字符串。使用下面的for循环中的模式,我原本希望有4个匹配,但我只得到了2个。

print(words[1])显示

"###Lorem ipsum dolor sit amet, Gruß consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam \n"

print(words[2])显示

"###At vero eos et accusam et justo duo dolores et ea rebum. Stet clita \nkasd gubergren, no sea takimata Gruß sanctus est \n"

有人能解释一下这种行为吗?

i = 0
content = "###Lorem ipsum dolor sit amet, Gruß consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam \n ###voluptua. ###At vero eos et accusam et justo duo dolores et ea rebum. Stet clita \nkasd gubergren, no sea takimata Gruß sanctus est \n###XLorem ipsum dolor sit amet. Lorem ipsum \ndolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor \ninvidunt ut labore et Gruß dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.sdl"
for word in string.gmatch(content, '###') do 
    i = i + 1 
end

if (i > 1) then 
    content = content .. '###' 
else 
end

words = {}
for y in string.gmatch(content, "(###.-)###") do 
    table.insert(words, y) 
end

print(words[3])
点赞
用户107090
用户107090

你的第一个循环确实找到了四个匹配项。尝试使用以下方法进行确认:

for word in string.gmatch(content, '###([^#]+)') do
  print(word)
end

如果它对您有用,那就根据需要在循环中保存 word

2014-11-18 22:24:16
用户1009479
用户1009479

这是你的第二个循环的简化版本:

content = '###aa###bb###cc###dd###'
words= {}
for y in string.gmatch(content,"(###.-)###") do
    print(y)
    table.insert(words, y)
end

输出:

###aa
###cc

问题在于,用模式 (###.-)###,第二个 ### 也被消耗了。你需要的是像正则表达式的 lookahead (###.+?)(?=###)。不幸的是,Lua 模式不支持 lookahead。这是一种可能的解决方法:

local left = content
local start = 1
while true do
    start, index, match = string.find(left, "(###.-)###")
    if not start then break end
    print(match)
    left = left:sub(index - 3)   --3 是 "###" 的长度
end
2014-11-19 10:56:00