我正在尝试创建一个与以下正则表达式匹配的正则表达式(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个实例。
我觉得我错过了一些简单的事情...先谢谢你的帮助!
答案 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):
匹配COT
或MED
[AB]?:
匹配由于?
-?:
匹配-
,这也是可选的
[\dJK]{1,8}:
这与number
或J
或K
匹配,长度至少为一个字符,最多为八个字符
(\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]?-?
,A
,B
,C
,然后选择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})