只有当表达式匹配长度不超过12个字符时,Regex才进行匹配

Regex to match only when expression match is no more than 12 characters long

本文关键字:Regex 字符 不超过 表达式 12个      更新时间:2023-09-26

我试图创建一个正则表达式(Java/JavaScript),匹配以下regex,但只有当有少于13个字符总数(和至少4)。

<罢工>(地中海床|)(ABCD) ? - ? [0 - 9] {1 4} (([JK] + [0 - 9] *) | (DDD) ' ?)> 初发布

(COT|MED)[ABCD]?-?[0-9]{1,4}(([JK]+[0-9]*)|(' [A-Z]+)?)

这些值应该(也确实)匹配:

MED-123
COTA-1224
MED4
COTB-892K777
MED-33 DDD
MED-234J5678

此值匹配,但我不希望它匹配(我只希望在总数少于12个字符时匹配):

COT-1111J11111111111111

参见http://regexr.com/3bs7b http://regexr.com/3bsfv

我已经尝试将我的表达式分组并将{4,12}放在最后,但这只是使它寻找整个表达式匹配的4到12个实例。

我觉得我错过了一些简单的东西…提前感谢您的帮助!

你可以使用否定的forward:

(?!.{13,})(COT|MED)[ABCD]?-?[0-9]{1,4}(([JK]+[0-9]*)|(' DDD)?)

由于表达式已经确保匹配以COT或MED开始,并且在此之后至少有一个数字,因此它已经保证至少有4个字符

我试过把我的表达式分组,并把{4,12}放在最后,但是这只会让它查找整个表达式的4到12个实例匹配。

查找整个表达式的4到12个实例,因为您没有添加单词边界'b。你的正则表达式工作得很好,只要添加一个单词边界,你想要的结果就会实现。看一下这个DEMO。

你的正则表达式看起来很笨拙,看起来有点难读。它也非常局限于某些字符,例如JK,除非你想这样做。对于更一般的模式,您可以查看

(COT|MED)[AB]?-?['dJK]{1,8}('s+D{1,3})?'b

(COT|MED): 匹配COTMED

[AB]?: 匹配A或B,这是可选的,因为?

存在

-?: 匹配-,这也是可选的

['dJK]{1,8}: 匹配长度至少为1个字符,最多8个字符的numberJK

('s+D{1,3})?: 匹配空格或D至少一次,最多3次,这是可选的

'b: 关于你的问题,这似乎是最重要的,它为已经匹配的单词创建了一个边界。这意味着任何超出匹配模式的内容都不会被捕获。

请看这里的demo DEMO2

你要找的答案是

(?!'S{13})(?:COT|MED)[ABCD]?-?'d{1,4}(?:[JK]+'d*|(?: [A-Z]+)?)

参见regex demo

请注意,如果一个短语不是一个完整的字符串,或者里面有空格,那么检查它的长度几乎是不可能的,因为边界有点"模糊"。因此,(?!'S{13})是一种解决方法,它只是确保您没有一个长度为13个字符或更长且没有空格的字符串。

正则表达式分解:

  • (?!'S{13}) -检查后面的子字符串是否不包含13个非空白字符
  • (?:COT|MED) - Any of the values in the alternation ( cot or med ')
  • [ABCD]?-? -可选A, B, C, D然后可选-
  • 'd{1,4} - 1 ~ 4位
  • (?:[JK]+'d*|(?: [A-Z]+)?) -一组2个备选方案:
    • [JK]+'d* - JK, 1次或以上,然后0位或以上
    • (?: [A-Z]+)? -可选空格和1个或多个拉丁大写字母

根据这个答案,你可以这样解决这个问题:

(?=(COT|MED)[ABCD]?-?[0-9]{1,4}(([JK]+[0-9]*)|(' DDD)?))(?={4 , 12})