[英]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.