我可以从迭代器中获取最后一个值吗?

时间:2016-02-08 20:45:19

标签: lua

我想通过分隔符拆分字符串,只获取最后一部分。一世 不关心其余的事情。我知道我能做到:

local last
for p in string.gmatch('file_name_test', '_%w+$') do last = p end

哪个有效,但是,恕我直言,丑陋。

有没有更优雅的方式说:

local last = string.gmatch('file_name_test', '_%w+$')[1]

哪个不起作用,因为gmatch返回迭代器(而不是表)。

3 个答案:

答案 0 :(得分:6)

使用不是迭代器的string.match

local last = string.match('file_name_test', '_(%w+)$')
print (last)  --> test

答案 1 :(得分:4)

模式_%w+$只返回一个匹配项。那是因为你将它锚定在字符串的末尾,所以它只能匹配或匹配不匹配(如果没有下划线,后面至少有一个%w字符)。

g*系列模式匹配用于迭代一系列匹配。如果您希望一次性所有匹配(作为多个返回值返回),请使用非g - 前缀函数。像string.match

string.match('file_name_test', '_%w+$')

如果没有匹配,那么您将获得nil

答案 2 :(得分:4)

虽然其他答案确实为您的情况提供了正确答案,但我将建议您回答问题。这是从迭代器中获取第一个项目。

答案其实很简单。由于迭代器只是在返回nil之前一直返回的东西,我们只需要调用它!

local first = string.gmatch('file_name_test', '_%w+$')()

然而,我很困惑,因为在你的问题中你还会询问它将返回的 last 事物。 I' M伤心地说你不能没有遍历他们都这样做,是因为一个迭代器不能"跳跃前进"