正则表达式:我可以命名一个 pattern/group 来在重用 pattern/group 时压缩代码吗?
Regex: Can I name a pattern/group to condense code when reusing the pattern/group?
我想命名或引用一个分组模式以供重复使用,而不是在该模式中强制执行类似匹配以缩短我的正则表达式。
我敢肯定有这样的例子有更明显的好处,但假设我想匹配由六个用冒号分隔的 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 位数字相同的东西才会匹配。
有没有办法命名模式以供完全重用?
如果支持,您可以使用repeating the subpattern
可能看起来像:
(?:([0-9A-Fa-f]{2}):){5}(?1)
^ ^^^^
或按姓名:
(?:(?<x>[0-9A-Fa-f]{2}):){5}(?&x)
^^^^^ ^^^^^
我想命名或引用一个分组模式以供重复使用,而不是在该模式中强制执行类似匹配以缩短我的正则表达式。
我敢肯定有这样的例子有更明显的好处,但假设我想匹配由六个用冒号分隔的 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 位数字相同的东西才会匹配。
有没有办法命名模式以供完全重用?
如果支持,您可以使用repeating the subpattern
可能看起来像:
(?:([0-9A-Fa-f]{2}):){5}(?1)
^ ^^^^
或按姓名:
(?:(?<x>[0-9A-Fa-f]{2}):){5}(?&x)
^^^^^ ^^^^^