通常我使用两个变量来存储这样的输出:
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
的未定义大小输出存储在一个数组中。
答案 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