我正在尝试制作一个公式 miniparser,输出应该是 5 组:
(1)(2)(3)(4)(5)
有 3 个可能的选项:
如果在字母大写之后,那么它后面可以跟'w',在这种情况下第二组是空的:
([2-3]?)()([ACD]{1})([w]?)([2']?)
在第二种情况下,第二组和第四组总是空的:
([2-3]?)()([acd]{1})()([2']?)
如果一开始有 2 位数字,则必须通过 '-' 并且第一个数字一定小于第二个数字......即 在这里,您需要以某种方式从可能的选项中排除选项“3-3”。在这种情况下,第四组始终为空。
([2-3]{1})-([3-5]{1})([acd]{1})()([2']?)
如何将这三个规则组合成一个公式?也许可以写得更紧凑一些?
基于捕获子模式编号重置的组对 PCRE 表达式进行轻微优化看起来像
查看表达式如何在线工作的示例。
细节
(?<![^ ,\n])
- 在当前位置之前不能有除空格、逗号或换行符以外的字符(?|
- 具有子模式编号重置的组:([23]?)()([MSEURFBDL])(w?)|
- 可选数字2
或3
(#1)、空字符串 (#2)、字母M
,S
,E
,U
,R
,F
,B
orD
(L
#3) 和可选字母w
(#4)([2-5]?)()([mseurfbdl])()|
- 可选数字从2
到5
(#1)、空字符串 (#2)、字母m
,s
,e
,u
,r
,f
,b
,d
orl
(#3) 和空字符串 (#4)(?|(2)-([3-5])|(3)-([45]))([mseurfbdl])()
- 数字2
(#1)、连字符、从3
到的数字5
(#2) OR (#1) 、连字符、3
数字4
或(5
#2)、字母、、、、、、、或(m
# 3 )和空字符串 (#4)s
e
u
r
f
b
d
l
)
- 第一组结束([2']?)
- 第 5 组:可选字符2
或'
(?![^, \n])
- 在当前位置之后不应有除空格、逗号或换行符以外的字符。