Lua中的重复正则表达式

Posted

技术标签:

【中文标题】Lua中的重复正则表达式【英文标题】:Repetitive regular expression in Lua 【发布时间】:2022-01-11 11:00:12 【问题描述】:

我需要找到 6 对十六进制数字(没有 0x)的模式,例如。 “00 5a 4f 23 aa 89”

这个模式适合我,但问题是有没有办法简化它?

[%da-f][%da-f]%s[%da-f][%da-f]%s[%da-f][%da-f]%s[%da-f][%da-f]%s[%da-f][%da-f]%s[%da-f][%da-f]

【问题讨论】:

string.rep("%x%x%s", 6):sub(1,-2) 【参考方案1】:

Lua patterns do not support limiting quantifiers 以及正则表达式支持的更多功能(因此,Lua 模式甚至不是正则表达式)。

您可以动态构建模式,因为您知道需要重复多少次模式的一部分:

local text = '00 5a 4f 23 aa 89'
local answer = text:match('[%da-f][%da-f]'..('%s[%da-f][%da-f]'):rep(5) )
print (answer)
-- => 00 5a 4f 23 aa 89

请参阅Lua demo。

'[%da-f][%da-f]'..('%s[%da-f][%da-f]'):rep(5) 可以进一步缩短为 %x 十六进制字符速记:

'%x%x'..('%s%x%x'):rep(5)

【讨论】:

【参考方案2】:

Lua supports %x 用于十六进制数字,因此您可以将所有 [%da-f] 替换为 %x

%x%x%s%x%x%s%x%x%s%x%x%s%x%x%s%x%x

Lua 不支持特定的量词n。如果是这样,你可以把它缩短很多。

【讨论】:

【参考方案3】:

您还可以在加号中使用“一个或多个”来缩短...

print(('Your MAC is: 00 5a 4f 23 aa 89'):match('%x+%s%x+%s%x+%s%x+%s%x+%s%x+'))
-- Tested in Lua 5.1 up to 5.4

在...https://www.lua.org/manual/5.4/manual.html#6.4.1中的“模式项:”下进行了描述

【讨论】:

此模式将匹配“000 1 234”,这可能不是 OP 想要的。 是的。就我个人而言,我喜欢匹配那些十六进制与: 分隔的输出中的MAC,就像ifconfig 的输出一样。通过简单的更改,它匹配 IPv6' - MAC:('%x+%:+%x+'):rep(5) IPv6:('%x+%:+%x+'):rep(4)【参考方案4】:

最终解决方案:

local text = '00 5a 4f 23 aa 89'
local pattern = '%x%x'..('%s%x%x'):rep(5)

local answer = text:match(pattern)
print (answer)

【讨论】:

您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center。

以上是关于Lua中的重复正则表达式的主要内容,如果未能解决你的问题,请参考以下文章

lua正则匹配中\t是啥意思?

Lua 正则表达式

使用正则表达式匹配 Lua 多行字符串和注释

lua的一些正则表达式

Lua:字符串匹配和正则表达式

仅在 Lua 中使用正则表达式替换整个单词