RegEx:如何匹配一个完整的字符串与负向前看的条件,覆盖后固定长度的区域?



我用正则表达式解析的字符串包含一个固定长度的区域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-]*$

演示

最新更新