将 Lua string.match 输出存储到数组
Posted
技术标签:
【中文标题】将 Lua string.match 输出存储到数组【英文标题】:Store Lua string.match output to array 【发布时间】:2014-07-10 18:38:00 【问题描述】:通常我使用两个变量来存储这样的输出:
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+)”。
所以这是我目前的思路:(我正在使用 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
的未定义大小输出存储在一个数组中。
【问题讨论】:
【参考方案1】:您可以将结果存储到表格中:
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
【讨论】:
为什么不用 string.match(whatever)
而不是table.pack(string.match(whatever))
?
@NiccoloM。你说得对,我想多了。我已经修改它以使用表构造函数。谢谢。
很抱歉在这里问这个问题,但这是我的第一个问题,除了接受你的回答,我还需要做什么吗?
@user3325563 现在您已经拥有超过 15 个声望,如果您愿意,您还可以投票支持对您有帮助的答案。你不必必须做任何事情。【参考方案2】:
由于您的模式中有两个捕获,因此您需要两个用于 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
【讨论】:
谢谢,道格。是的,这就是我通常的做法,但这里的问题是要搜索的未定义字数(可以是 1、2、3、...),但上面的解决方案解决了这个问题。以上是关于将 Lua string.match 输出存储到数组的主要内容,如果未能解决你的问题,请参考以下文章