Lua gmatch 将捕获的组存储为数组

Posted

技术标签:

【中文标题】Lua gmatch 将捕获的组存储为数组【英文标题】:Lua gmatch store captured groups as an array 【发布时间】:2021-07-20 00:09:46 【问题描述】:

我对 Lua 比较陌生。对于gmatch的每一个匹配,我想将捕获组结果放入一个数组中。

我的想法是,我将每个匹配项的所有捕获组作为一个数组,这样我就可以对这个数组进行操作,例如将每个捕获组转换为 int。

我将如何更改以下内容,使其打印出3 2 1

function split_ipv4(str)
    for parts in str:gmatch('(%d%d?%d?)%.(%d%d?%d?)%.(%d%d?%d?)%.(%d%d?%d?), ') do
       print(parts[4])
    end
end

split_ipv4('192.168.0.3, 192.168.0.2, 192.168.0.1')

parts 更改为p1, p2, p3, p4 并打印p4 可行,但有没有办法不为每个组创建一个变量?

【问题讨论】:

【参考方案1】:

最简单的方法是将parts改为p1, p2, p3, p4 但在变量恐惧症的情况下:

function split_ipv4(str)
   for addr in str:gmatch'%d%d?%d?%.%d%d?%d?%.%d%d?%d?%.%d%d?%d?' do
      local parts = addr:match'(%d+)%.(%d+)%.(%d+)%.(%d+)'
      print(parts[4])
    end
end

split_ipv4('192.168.0.3, 192.168.0.2, 192.168.0.1')

【讨论】:

+1。感谢您的回答。我也想过这个想法,但是就像你说的那样,对于 IPv4,它并不比p1, p2, p3, p4 好多少。我想在 IPv6 的情况下会更好。 IPv6 没有被单一的 Lua 模式覆盖。

以上是关于Lua gmatch 将捕获的组存储为数组的主要内容,如果未能解决你的问题,请参考以下文章

Lua - gmatch科学记数法字符串到数字

Lua gmatch奇数字符(斯洛伐克字母)

将 Lua string.match 输出存储到数组

如何将函数的所有结果存储到Lua中的单个变量中?

在Lua中拆分字符串?

如何将正则表达式捕获存储在 Perl 的数组中?