Сохраните вывод Lua string.match в массив

Обычно я использую две переменные для хранения вывода чего-то вроде этого:

a = {'alarm boy car dentist','alarm car dentist elephant','alarm dentist elephant fabulous','alarm elephant fabulous goat'}
k, v = string.match(a[1], 'alarm dentist (%w+) (%w+)' )
print(k, v)
elephant fabulous

но вместо использования двух переменных я хотел бы сохранить их в массиве или таблице.

Моя конечная цель — создать функцию, в которую я ввожу массив (в данном случае это «a») и шаблон (в данном случае «тревожный стоматолог (%w+) (%w+)»), и что она возвращает желаемое сопровождающее слово/слова, если они найдены, или «ноль» в противном случае. Загвоздка в том, что количество слов, которые ищет шаблон, не определено. В данном случае это 2, но я хочу, чтобы пользователь мог вводить любой шаблон, то есть «тревожный стоматолог (%w+) (%w+) (%w+) (%w+)» или «тревожный стоматолог (%w+)».

Так что до сих пор я думал так: (я использую инструмент командной строки в Ubuntu 12.04LTS, чтобы протестировать его)

a = {'alarm boy car dentist','alarm car dentist elephant','alarm dentist elephant fabulous','alarm elephant fabulous goat'}
function parse_strings (array, pattern)
words = nil
for i=1, #array do
    c = string.match(array[i], pattern)
    if c ~= nil then
        words = c
        end
    end
    return words
end
print (parse_strings (a, 'alarm dentist (%w+) (%w+)'))
elephant

но только первое значение хранится в "c" вместо c[1]='elephant' и c[2]='fabulous'.

В худшем случае я мог бы найти, сколько слов ищет шаблон, но мне все равно нужно было бы найти способ сохранить вывод неопределенного размера из string.match в одном массиве.


person user3325563    schedule 21.05.2014    source источник


Ответы (2)


Вы можете сохранить результат в таблице:

local t = {string.match(array[i], pattern)}
if #t ~= 0 then
    words = t
    end
end

Возвращаемое значение parse_string теперь представляет собой таблицу:

local result =  (parse_strings (a, 'alarm dentist (%w+) (%w+)'))
for k, v in ipairs(result) do
    print(k, v)
end
person Yu Hao    schedule 22.05.2014
comment
Почему бы не использовать { string.match(whatever) } вместо table.pack(string.match(whatever))? - person Niccolo M.; 22.05.2014
comment
@НикколоМ. Вы правы, я слишком много думал. Я изменил его, чтобы использовать конструктор таблицы. Спасибо. - person Yu Hao; 22.05.2014
comment
Извините, что спрашиваю это здесь, но это мой первый вопрос, должен ли я сделать что-то еще, кроме того, чтобы принять ваш ответ? - person user3325563; 22.05.2014
comment
@user3325563 user3325563 Теперь, когда у вас более 15 репутации, вы также можете голосовать за ответы, которые помогут вам, если хотите. Вам не необходимо ничего делать. - person Yu Hao; 23.05.2014

Поскольку в вашем шаблоне есть два захвата, вам нужны две переменные результата для match. Пытаться:

words = nil
for i=1, #array do
    c,d = string.match(array[i], pattern)
    if c ~= nil then
        words = {c,d}
        return words
    end
end

Это дает...

> for k,v in ipairs(words) do print (k,v) end
1   elephant
2   fabulous
person Doug Currie    schedule 21.05.2014
comment
Спасибо, Дуг. Да, я обычно это делаю так, но проблема здесь в неопределенном количестве слов для поиска (это может быть 1,2,3,...), но решение, приведенное выше, решает эту проблему. - person user3325563; 22.05.2014