正则表达式:如何将整个字符串与固定长度区域匹配,并在之后覆盖负面的前瞻条件?

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 次以上
  • $ 字符串结束

Regex demo

如果 atomic groups 可用:

^(?=[\d-]{5})(?>\d+-*|-{5})[A-Z\d_]*$
  • ^ 字符串开头
  • (?=[\d-]{5}) 断言至少 5 个字符 - 或数字
  • (?> 原子团
    • \d+-* 匹配1+位和可选-
    • |
    • -{5} 匹配 5 次 -
  • ) 关闭原子组
  • [A-Z\d_]* 匹配可选字符 A-Z 数字或 _
  • $ 字符串结束

Regex demo

使用非字边界断言\B:

^[-\d](?:-|\B\d){4}[A-Z\d-]*$

非单词边界在两个单词字符(来自\w[A-Za-z0-9_])或两个非单词字符(来自\W[^A-Za-z0-9_]). (以及非单词字符和字符串的限制之间)

有了它,每个 \B\d 总是跟着一个数字。 (并且不能跟随破折号)

demo


其他方式(如果允许后视):

^\d*-*(?<=^.{5})[A-Z\d-]*$

demo