Lua 中的重复正则表达式

Repetitive regular expression in Lua

我需要找到 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]

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}。如果是这样,您可以将其缩短很多。

以及正则表达式支持的更多功能(因此,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 十六进制字符 shorthand:

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

您也可以使用带有加号的“一个或多个”来缩短...

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

最终解决方案:

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

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