【问题标题】:How to simply this regex?如何简化这个正则表达式?
【发布时间】:2018-12-08 13:21:13
【问题描述】:

你能帮我简化下面的正则表达式吗:

(^0x)([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})

我想要以下结果 如果字符串以 0x 开头,则匹配下一个表达式

0x010203040506

应该产生

- group 1: 01

- group 2: 02

- group 3: 03

- group 4: 04

- group 5: 05

- group 6: 06

如果字符串不以 0x 开头,那么应该没有匹配项。

谢谢,

【问题讨论】:

  • 这无法简化,因为您涉及许多捕获组。但它可能会有点短:(^0x)([0-9a-f]{2})((?2))((?2))((?2))((?2))((?2))
  • 你想匹配什么,你的首选结果是什么?
  • \A0x|\G(?!\A)[0-9a-f]{2},如果您不打算同时验证。
  • 捕获组旨在将多个模式组合在一起,而您正在尝试创建同一捕获组的多个副本。为什么会这样?

标签: regex preg-match regex-group regex-greedy


【解决方案1】:

您可以使用 RegEx 的 Subroutines 来避免使用多个字符类:

\A0x([0-9a-f]{2})((?1))((?1))((?1))((?1))((?1))

Example

使用\G 锚点,您可以走得更短:

\A0x|\G(?!\A)[0-9a-f]{2}

Example

【讨论】:

    【解决方案2】:

    此外,在我上面的 cmets 上,您可以考虑使用 (?(DEFINE)...) 构造函数来验证和匹配:

    (?x)(?(DEFINE)
        (?<X>[0-9a-f]{2})
    )
    \A0x(?=(?&X){5})|\G(?!\A)(?&X)
    

    live demo here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多