使用单一模式来匹配多个单词Lua脚本

时间:2017-02-14 08:46:55

标签: linux lua ubuntu-14.04

我有简单的文字如下:

Hello World [all 1]
Hi World [words 2]
World World [are 3]
Hello Hello [different 4]

我希望使用Lua将方括号中的所有单词设置为数组中的变量。 我在下面尝试以下代码:

text = 'Hello World [all 1]\nHi World [words 2]\nWorld World [are 3]\nHello Hello [different 4]'

array = {string.match(text, '[%a%s]*%[([%a%s%d]*)%]')}

for i = 1,#array do
print(array[i])
end

输出为“全1”。我的目标是打印输出为

all 1
words 2
are 3
different 4

我试图添加3个相同的模式如下:

array = {string.match(text, '[%a%s]*%[([%a%s%d]*)%].-[%a%s]*%[([%a%s%d]*)%].-[%a%s]*%[([%a%s%d]*)%].-[%a%s]*%[([%a%s%d]*)%]')}

它正在发挥作用。但我不认为这是最好的方式,特别是当文本加载100行等的行时,这样做的正确方法是什么?

提前感谢。

1 个答案:

答案 0 :(得分:1)

Lua模式do not support repeated captures,但您可以使用string.gmatch()(它返回迭代器函数)和输入字符串,使用模式"%[(.-)%]"来捕获所需的文本:

text = 'Hello World [all 1]\nHi World [words 2]\nWorld World [are 3]\nHello Hello [different 4]'

local array = {}
for capture in string.gmatch(text, "%[(.-)%]") do
   table.insert(array, capture)
end

for i = 1, #array do
   print(array[i])
end

上面的代码给出了输出:

all 1
words 2
are 3
different 4

请注意,如果需要,可以在一行中完成此操作:

array = {} for c in string.gmatch(text, "%[(.-)]") do table.insert(array, c) end

另请注意,无需逃离隔离的右括号,如最后一个示例所示。