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

时间:2015-09-25 19:04:42

标签: javascript java regex

我正在尝试创建一个与以下正则表达式匹配的正则表达式(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个实例。

我觉得我错过了一些简单的事情...先谢谢你的帮助!

4 个答案:

答案 0 :(得分:2)

您可以使用否定预测:

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

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

答案 1 :(得分:2)

  

我尝试将表达式分组并将{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}: 这与numberJK匹配,长度至少为一个字符,最多为八个字符

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

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

请参阅此处的演示DEMO2

答案 2 :(得分:1)

您正在寻找的答案是

(?!\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 {1}} MED`)
  • or - 可选[ABCD]?-?ABC,然后选择D
  • - - 1到4位
  • \d{1,4} - 一组2个替代方案:
    • (?:[JK]+\d*|(?: [A-Z]+)?) - [JK]+\d*J,1次或更多次,然后是0位或更多位
    • K - 可选空格和1个或多个拉丁大写字母

答案 3 :(得分:0)

正如answer所暗示的那样,你可以这样解决这个问题:

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