【问题标题】:Repetitive regular expression in LuaLua中的重复正则表达式
【发布时间】: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)

标签: lua lua-patterns


【解决方案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
      猜你喜欢
      • 2021-05-21
      • 2014-08-26
      • 2020-02-07
      • 1970-01-01
      • 1970-01-01
      • 2011-06-12
      • 2015-04-08
      • 2023-03-22
      • 1970-01-01
      相关资源
      最近更新 更多