[英]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):
匹配COT
或MED
[AB]?:
匹配A或B是可选的,因为存在?
-?:
匹配-
这也是可选的
[\\dJK]{1,8}:
这匹配一个number
,或J
或K
,长度至少为一个字符,最多为八个字符。
(\\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]?-?
- 可选A
, B
, C
, D
然后可选-
\\d{1,4}
- 1到4位数 (?:[JK]+\\d*|(?: [AZ]+)?)
- 一组2个替代方案:
[JK]+\\d*
- J
或K
,1次或更多次,然后是0或更多位数 (?: [AZ]+)?
- 可选空间和一个或多个拉丁大写字母 正如这个答案所暗示的那样,你可以这样解决:
(?=(COT|MED)[ABCD]?-?[0-9]{1,4}(([JK]+[0-9]*)|(\ DDD)?))(?={4 , 12})
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.