我用正则表达式解析的字符串包含一个固定长度的区域N
,其中可以是数字或破折号。但是,如果出现破折号,则该区域的其余部分只允许使用破折号。在此区域之后,允许出现数字、破折号和字母。
示例(N=5
,从头开始):
12345ABC
12345123
1234-1
1234--1
1----1AB
如何正确匹配?我目前被困在像(?:d|-(?!d)){5}[A-Z0-9-]+
(N=5
)的东西,但我不能使数字直接跟随我的区域工作,如果一个横线存在,因为消极的向前看阻碍了比赛。
不应该匹配的字符串(N=5
)
1-2-3-A
----1AB
--1--1A
您可以断言前5个字符是数字或-
,并确保前5个字符中数字前没有-
^(?![d-]{0,3}-d)(?=[d-]{5})[A-Zd-]+$
^
字符串 起始(?![d-]{0,3}-d)
确保在前5个字符中,数字 前没有(?=[d-]{5})
断言至少5位数字或-
[A-Zd-]+
匹配1+倍列出的字符$
字符串结束
-
Regex演示
如果原子组可用:
^(?=[d-]{5})(?>d+-*|-{5})[A-Zd_]*$
^
起始字符串(?=[d-]{5})
断言至少5个字符-
或数字(?>
原子组d+-*
匹配1+数字和可选-
|
或-{5}
匹配5次-
)
关闭原子组[A-Zd_]*
匹配可选字符A-Z数字或_
$
字符串结束
Regex演示
使用非字边界断言B
:
^[-d](?:-|Bd){4}[A-Zd-]*$
在两个单词字符(来自w
或[A-Za-z0-9_]
)或两个非单词字符(来自W
或[^A-Za-z0-9_]
)之间的位置成功使用非单词边界。(以及在非单词字符和字符串限制之间)
使用它,每个Bd
总是跟在一个数字后面。(不能跟破折号)
其他方式(如果允许向后看):
^d*-*(?<=^.{5})[A-Zd-]*$
演示