【问题标题】:Splitting string into substrings in Lua在Lua中将字符串拆分为子字符串
【发布时间】:2015-01-16 06:36:03
【问题描述】:

我正在尝试使用 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])

【问题讨论】:

    标签: string lua substring lua-patterns


    【解决方案1】:

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

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

    输出:

    ###aa
    ###cc
    

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

    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 is the length of "###"
    end
    

    【讨论】:

      【解决方案2】:

      您的第一个循环确实找到了四个匹配项。试试这个来确认:

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

      如果这对您有用,请根据需要将 word 保存在循环中。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-09-26
        • 1970-01-01
        • 2010-11-28
        • 2018-06-01
        • 2016-08-25
        • 2011-11-25
        • 1970-01-01
        相关资源
        最近更新 更多