正则表达式:重用模式/组时,我可以命名模式/组来压缩代码吗?

时间:2019-06-16 14:47:36

标签: regex regex-group

我想命名或引用一个分组的模式以供重用,而不必在该模式上强制进行类似的匹配以缩短我的正则表达式。

我敢肯定,这样做的例子会带来更多明显的好处,但我想匹配一个由六个用冒号分隔的2位十六进制数字组成的字符串,例如38:f8:b7:90:45:92

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

[0-9A-Fa-f]{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之类的东西(后两个两位数相同)会匹配。

是否可以命名模式以完全重用?

1 个答案:

答案 0 :(得分:2)

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

可能看起来像:

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

Regex demo

或按名称:

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

Regex demo