我能否从迭代器中获取最后一个值?

我想通过某个分隔符拆分一个字符串并仅获取最后一部分。我不关心其余部分。我知道我可以这样做:

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 返回的是一个迭代器(而不是一个表)。

点赞
用户5043289
用户5043289

使用string.match而非迭代器:

local last = string.match('file_name_test', '_(%w+)$')
print (last)  --> test
2016-02-08 21:00:38
用户734069
用户734069

模式_%w+$只会返回单个匹配。这是因为你将其锚定在字符串的结尾,所以它只能匹配或无法匹配(如果在结尾处没有下划线后跟至少一个%w字符)。

g*模式匹配系列是为了迭代一系列匹配。如果您想要一次性获得所有匹配(作为多个返回值返回),请使用非g前缀函数。例如string.match

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

如果没有匹配,则会返回nil

2016-02-08 21:02:34
用户3979429
用户3979429

虽然其他答案对于你的_情况_给出了正确的答案,但我想回答你的_问题_。那就是从迭代器中获取第一个项。

其实答案非常简单。由于迭代器只是继续返回,直到返回空值,我们只需要调用它!

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

然而,我非常困惑,因为在你的问题中你还问到了它将返回的_最后一个_东西。很遗憾,你不能在不迭代所有项的情况下做到这一点,因为迭代器不能“提前跳过”。

2016-02-09 03:20:26