Съхранявайте 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
@NiccoloM. Прав си, премислих. Модифицирах го, за да използва конструктор на таблици. Благодаря. - person Yu Hao; 22.05.2014
comment
Съжалявам, че питам това тук, но това е първият ми въпрос, трябва ли да направя нещо друго в допълнение, за да приема отговора ви? - person user3325563; 22.05.2014
comment
@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