将Lua string.match输出存储到数组

时间:2014-05-21 22:11:35

标签: arrays string lua lua-patterns

通常我使用两个变量来存储这样的输出:

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 +)')如果找到则返回所需的随附单词,否则返回'nil'。问题是模式寻找的单词数量是未定义的。在这种情况下是2,但我希望用户能够输入任何模式,即'报警牙医(%w +)(%w +)(%w +)(%w +)'或'报警牙医(%w +)'。 / p>

所以这是我到目前为止的思路:(我正在使用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的未定义大小输出存储在一个数组中。

2 个答案:

答案 0 :(得分:4)

您可以将结果存储到表格中:

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

答案 1 :(得分:0)

由于模式中有两个捕获,因此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