2017-02-14 15 views
1

У меня есть простой текст, как показано ниже:Использование одного шаблон для строки поиска нескольких слов Lua сценарий

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 и т. Д. Каков правильный способ сделать это?

благодарит заранее.

+0

Эти строки находятся в файле или это одна строка, которую вы хотите найти? –

+0

спасибо, что ответим. это единственная строка, содержащая все слова выше. – wakhaiha

+0

'array = {} для s в s: gmatch '% b []' сделать массив [# array + 1] = s: sub (2, -2) end' – tonypdmtr

ответ

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 

Также обратите внимание, что нет необходимости избегать изолированной закрывающей скобки, как демонстрирует этот последний пример.