簡體   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