参考前一个备用组的同一分支

Refer to same branch of previous alternate group

我需要构建一个包含捕获组的正则表达式,结果如下:

12-34 # match: (1) (2) (3) (4)
1a-2b # match: (1) (a) (2) (b)
12-3b # nomatch

简而言之,如果第一部分有两位数,那么第二部分也必须有两位数。如果它有一个字母,那么第二部分也必须有一个字母。

在 PCRE 风格中,(\d)(\d|[abc])-(\d)(\d|[abc]) 匹配第三行,因此过于宽松。

使用命名组,(\d)(?<named>\d|[abc])-(\d)(?P=named) 根本不匹配任何行,因为它要求第二个字符完全相同。限制太多了。

有什么方法可以要求我的第二个备用组 (\d|[abc]) 与第一个 (\d|[abc]) 使用相同的分支?
或者我是否需要依赖完整的 (?:(\d)(\d)-(\d)(\d)|(\d)([abc])-(\d)([abc])) 来复制我的正则表达式的一部分?

在 PCRE 中你可以使用这个正则表达式:

^(?:(?<num>\d{2})-(?&num)|(?<alnum>\d\pL)-(?&alnum))$

RegEx Demo 1

正则表达式详细信息:

  • (?<num>\d{2}): 命名组 num 用于匹配 2 个数字
  • (?<alnum>\d\pL): 命名组 alnum 用于匹配 1 个数字后跟一个字母
  • (?&num):匹配与命名组 num
  • 中相同的子模式
  • (?&alnum):匹配与命名组 alnum
  • 中相同的子模式

另一种选择是使用conditional sub-patterns in PCRE作为:

^(?:(?<num>\d{2})|\d\pL)-(?(num)\d{2}|\d\pL)$

RegEx Demo 2