繁体   English   中英

仅当表达式匹配长度不超过12个字符时才匹配正则表达式

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

我正在尝试创建一个与以下正则表达式匹配的正则表达式(Java / JavaScript),但仅限于总共少于13个字符(并且最少为4个)。

(COT | MED)[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个实例。

我觉得我错过了一些简单的事情......提前感谢您的帮助!

您可以使用否定前瞻:

(?!.{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}:这匹配一个number ,或JK ,长度至少为一个字符,最多为八个字符。

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

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

请参阅DEMO2演示

你正在寻找的答案是

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

请参阅正则表达式演示

请注意,几乎不可能检查不是整个字符串或内部有空格的短语的长度,因为边界有点“模糊”。 因此, (?!\\S{13})是一种解决方法,只是确保您没有没有13个字符长或更长的空格的字符串。

正则表达式细分:

  • (?!\\S{13}) - 检查后面的子字符串是否包含13个非空白字符
  • (?:COT|MED) - Any of the values in the alternation ( COT or MED`)
  • [ABCD]?-? - 可选ABCD然后可选-
  • \\d{1,4} - 1到4位数
  • (?:[JK]+\\d*|(?: [AZ]+)?) - 一组2个替代方案:
    • [JK]+\\d* - JK ,1次或更多次,然后是0或更多位数
    • (?: [AZ]+)? - 可选空间和一个或多个拉丁大写字母

正如这个答案所暗示的那样,你可以这样解决:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM