我需要找到一个由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)