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中的重复正则表达式的主要内容,如果未能解决你的问题,请参考以下文章