Lua 我可以创建一个返回可变数量值的gmatch模式吗?

Lua 我可以创建一个返回可变数量值的gmatch模式吗?,lua,lpeg,Lua,Lpeg,我需要在我正在编写的程序中迭代一些字符串对。我没有将字符串对放在一个大的表中,而是将它们全部放在一个字符串中,因为我认为最终结果更容易阅读: function two_column_data(data) return data:gmatch('%s*([^%s]+)%s+([^%s]+)%s*\n') end for a, b in two_column_data [[ Hello world Olá hugomg ]] do print( a .. ", " .. b

我需要在我正在编写的程序中迭代一些字符串对。我没有将字符串对放在一个大的表中,而是将它们全部放在一个字符串中,因为我认为最终结果更容易阅读:

function two_column_data(data)
  return data:gmatch('%s*([^%s]+)%s+([^%s]+)%s*\n')
end

for a, b in two_column_data [[
  Hello  world
  Olá    hugomg
]] do
  print( a .. ", " .. b .. "!")
end
输出是您所期望的:

Hello, world!
Olá, hugomg!
但是,正如名称所示,
two\u column\u data
函数仅在正好有两列数据时才起作用。如何使其在任意数量的列上工作

for x in any_column_data [[
  qwe
  asd
]] do
  print(x)
end

for x,y,z in any_column_data [[
  qwe rty uio
  asd dfg hjk
]] do
  print(x,y,z)
end

如果有必要,我可以使用lpeg执行此任务。

外循环返回行,内循环返回行中的单词

function any_column_data(data)
  local f = data:gmatch'%S[^\r\n]+'
  return
    function()
      local line = f()
      if line then
        local row, ctr = line:gsub('%s*(%S+)','%1 ')
        return row:match(('(.-) '):rep(ctr))
      end
    end
end
s = [[
  qwe rty uio
  asd dfg hjk
]]

for s in s:gmatch('(.-)\n') do
  for s in s:gmatch('%w+') do
    io.write(s,' ')
  end
  io.write('\n')
end

外循环返回行,内循环返回行中的字

s = [[
  qwe rty uio
  asd dfg hjk
]]

for s in s:gmatch('(.-)\n') do
  for s in s:gmatch('%w+') do
    io.write(s,' ')
  end
  io.write('\n')
end

这是一个lpeg的重新版本

函数重新列数据(subc)
局部t,i=re.compile([[

记录这是一个lpeg的重新版本

函数重新列数据(subc)
局部t,i=re.compile([[


记录
函数k_column_data(k,data)返回数据:gmatch((“%s*(%s+)):rep(k))end
@Egor我想问题是他不知道什么是k,我认为这应该起作用:首先捕获每一行,然后捕获每一个单词,将单词放在一个表中,并在返回
函数k_column_data(k,data)时解包返回数据:gmatch((“%s*(%s+)):rep(k))结束
@Egor我想重点是他不知道“k”是什么,我认为这应该行得通:先抓住每一行,然后抓住每一个单词,把单词放在表格中,然后在返回时打开包装抱怨?你不想让这个人明白他的代码里有什么吗?@warspyking,我不在乎他,只是想试着写一个algo)似乎伊戈尔·斯克里普托诺夫把它缩短了,更清晰了。看起来路易斯也有同样的感觉。除非他们理解代码的工作原理,否则给他们代码是没有意义的,因为在他之前的问题中缺乏足够的信息,你只会遇到更多的问题。发牢骚?你不想让这个人理解他的代码中有什么吗代码?@warspyking,我不在乎他,只是想试着写算法)似乎Egor Skriptunoff把它缩短了,更清晰了。看起来Louis也有同样的感觉。除非他们理解代码的工作原理,否则给他们代码是没有意义的,因为在他之前的问题中,如果没有足够的信息,你只会遇到更多的问题。单独的代码块并不能提供一个好的答案。请添加explanations。除非代码(如本例中所示)即使是一个初学者,这也是不言而喻的。否则,我将不得不用我给出的每一个答案来教授计算机科学。:)也许是给你和提问者的。但请记住,你并不孤单。只要解释你的答案解决问题的原因,错误在哪里,你用什么来解决问题,等等……我建议你仔细阅读。一段代码单独使用block不能提供一个好的答案。请添加解释。除非代码(如本例所示)即使是一个初学者,这也是不言而喻的。否则,我将不得不用我给出的每一个答案来教授计算机科学。:)也许是给你和提问者的。但请记住,你并不孤单。只要解释一下你的答案解决问题的原因,错误在哪里,你用什么来解决问题,等等……我建议你仔细阅读为OP返回最后一个零,零对input@wqw-这似乎是必需的。请发布行为错误的代码。我的不好。我在测试输入的最后一行有一些额外的空格。@wqw-像在代码中一样?是的,格式化代码后可能有问题。已修复。这将为操作返回最后的nil,nil对input@wqw-似乎符合要求。请张贴行为错误的代码。我的不好。我在测试输入的最后一行有一些额外的空格。@wqw-类似于代码中的?是的,格式化代码后可能有问题。已修复。
for a, b, c in re_column_data([[
    Hello  world "test
test"
    Olá    "hug omg"
""]].."\tempty a") do
    print( a .. ", " .. b .. "! " .. (c or ''))
end