【发布时间】: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