参考前一个备用组的同一分支
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))$
正则表达式详细信息:
(?<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)$
我需要构建一个包含捕获组的正则表达式,结果如下:
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))$
正则表达式详细信息:
(?<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)$