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模式不支持限定量词和正则表达式支持的更多功能(因此,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演示。

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

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

Lua支持十六进制数字的%x,因此您可以将所有[%da-f]替换为%x:

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

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

您还可以使用;一个或多个";用加号来缩短。。。

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)

最新更新