【问题标题】:Regex: Can I name a pattern/group to condense code when reusing the pattern/group?正则表达式:重用模式/组时,我可以命名模式/组以压缩代码吗?
【发布时间】:2019-06-16 14:47:36
【问题描述】:

我想命名或引用一个分组模式以供重复使用,而无需在此模式中强制进行类似匹配以缩短我的正则表达式。

我确信有一些例子对执行这样的操作有更明显的好处,但是假设我想匹配一个由六个用冒号分隔的 2 位十六进制数字组成的字符串,例如 38:f8:b7:90:45:92

为此我想出的模式是(?:[0-9A-Fa-f]{2}:){5}[0-9A-Fa-f]{2}

[0-9A-Fa-f]{2} 用于表示 2 位十六进制数,我将其称为十六进制模式。我不想在冒号后重复第二次,我想要一种方法来命名这个或其他东西,这样我就可以缩短我的正则表达式。

我已经尝试过(?:(?<x>[0-9A-Fa-f]{2}):){5}\k<x>,但它不是我制作的原始十六进制模式,它似乎只与找到的十六进制模式的最后一个匹配匹配。例如,在38:f8:b7:90:45:92 上运行此正则表达式基本上会将模式转换为([0-9A-Fa-f]{2}):){5}45,因为 45 是找到的原始十六进制模式的最后一个匹配项。

因此,只有像 00:18:12:c1:5a:5a 这样最后两个 2 位数字相同的内容才会匹配。

有没有办法为完全重用的模式命名?

【问题讨论】:

  • 如果它是 pcre 例如,您可以递归第一个子模式(?:([0-9A-Fa-f]{2}):){5}(?1) 或名称(?:(?<x>[0-9A-Fa-f]{2}):){5}(?&x)

标签: regex regex-group


【解决方案1】:

如果支持,您可以使用repeating the subpattern

可能看起来像:

(?:([0-9A-Fa-f]{2}):){5}(?1)
   ^                    ^^^^

Regex demo

或按名称:

(?:(?<x>[0-9A-Fa-f]{2}):){5}(?&x)
   ^^^^^                    ^^^^^

Regex demo

【讨论】:

  • 第一个看起来更短,但第二个答案正是我想要的!谢谢!
  • 不客气。它不是更短,但您也可以通过先定义组来扭转它(?&lt;x&gt;[0-9A-Fa-f]{2})(?::(?&amp;x)){5}
猜你喜欢
  • 2021-08-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-20
  • 1970-01-01
  • 2010-12-26
  • 2013-12-23
  • 2012-01-24
相关资源
最近更新 更多