正则表达式:如何将整个字符串与固定长度区域匹配,并在之后覆盖负面的前瞻条件?
RegEx: How to match a whole string with fixed-length region with negative look ahead conditions that are overriden afterwards?
我用正则表达式解析的字符串包含一个固定长度的区域 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-Z\d-]+$
^
字符串开头
(?![\d-]{0,3}-\d)
确保前 5 个字符中的数字 前没有 -
(?=[\d-]{5})
断言至少 5 位数字或 -
[A-Z\d-]+
匹配任何列出的字符 1 次以上
$
字符串结束
如果 atomic groups 可用:
^(?=[\d-]{5})(?>\d+-*|-{5})[A-Z\d_]*$
^
字符串开头
(?=[\d-]{5})
断言至少 5 个字符 -
或数字
(?>
原子团
\d+-*
匹配1+位和可选-
|
或
-{5}
匹配 5 次 -
)
关闭原子组
[A-Z\d_]*
匹配可选字符 A-Z 数字或 _
$
字符串结束
使用非字边界断言\B
:
^[-\d](?:-|\B\d){4}[A-Z\d-]*$
非单词边界在两个单词字符(来自\w
即[A-Za-z0-9_]
)或两个非单词字符(来自\W
即[^A-Za-z0-9_]
). (以及非单词字符和字符串的限制之间)
有了它,每个 \B\d
总是跟着一个数字。 (并且不能跟随破折号)
其他方式(如果允许后视):
^\d*-*(?<=^.{5})[A-Z\d-]*$
我用正则表达式解析的字符串包含一个固定长度的区域 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-Z\d-]+$
^
字符串开头(?![\d-]{0,3}-\d)
确保前 5 个字符中的数字 前没有 (?=[\d-]{5})
断言至少 5 位数字或-
[A-Z\d-]+
匹配任何列出的字符 1 次以上$
字符串结束
-
如果 atomic groups 可用:
^(?=[\d-]{5})(?>\d+-*|-{5})[A-Z\d_]*$
^
字符串开头(?=[\d-]{5})
断言至少 5 个字符-
或数字(?>
原子团\d+-*
匹配1+位和可选-
|
或-{5}
匹配 5 次-
)
关闭原子组[A-Z\d_]*
匹配可选字符 A-Z 数字或_
$
字符串结束
使用非字边界断言\B
:
^[-\d](?:-|\B\d){4}[A-Z\d-]*$
非单词边界在两个单词字符(来自\w
即[A-Za-z0-9_]
)或两个非单词字符(来自\W
即[^A-Za-z0-9_]
). (以及非单词字符和字符串的限制之间)
有了它,每个 \B\d
总是跟着一个数字。 (并且不能跟随破折号)
其他方式(如果允许后视):
^\d*-*(?<=^.{5})[A-Z\d-]*$