使用单一模式来匹配多个单词的Lua脚本字符串

我有如下简单的文本:

你好世界[全1]
嗨世界[2个单词]
世界世界[是3个]
你好你好[不同4]

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

text = '你好世界[全1]\n嗨世界[2个单词]\n世界世界[是3个]\n你好你好[不同4]'

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

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

输出结果是"全1"。我的目标是将输出打印为

全1
2个单词
是3个
不同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等。怎么做才是正确的?

谢谢。

点赞
用户6879826
用户6879826

Lua patterns 不支持重复捕获,但是你可以使用 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

还要注意,没有必要转义孤立的闭括号,正如最后一个例子所示。

2017-02-14 09:28:24