将 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 输出存储到数组的主要内容,如果未能解决你的问题,请参考以下文章

lua: 截取字符串/home/root/test/123:输出结果为123 ,怎么弄呢?

LUA 字符串短语匹配

Lua从路径中删除第一个目录

lua如何从字符串提取某一个字符

如何在字符串中找到子字符串?

Lua简单解析xml