簡體   English   中英

正則表達式{m,n}和(正則表達式){m,n}之間有什么區別?

[英]What's difference between regex{m,n} and (regex){m,n}?

我正在開發一個docker項目,需要編寫一個正則表達式來檢查存儲庫名稱。 要求如下:

  1. 僅包含ASCII字符,排除upcase。
  2. 除了點(。),連字符( - )和下划線(_)之外,特殊字符除外。
  3. 只從字母和數字開始,並以它結束。
  4. 特殊字符不能連續出現。
  5. 長度限制(最小值:2,最大值:255)

那么,我的正則表達式是:

([a-z0-9]+(?:[._-][a-z0-9]+)*){2,255}

但是,當存儲庫名稱為e-e_1.1時,它可能不行

當我將其更改為:

[a-z0-9]+(?:[._-][a-z0-9]+)*{2,255}

沒關系。

有人可以解釋一下嗎? 先感謝您。

([a-z0-9]+(?:[._-][a-z0-9]+)*){2,255}正則表達式中,限制量詞{2,255}應用於第1組內的整個模式( [a-z0-9]+(?:[._-][a-z0-9]+)* )。 這意味着它可以重復2到255次。 這並不意味着整個字符串長度限制為2到255個字符。

現在,您的[a-z0-9]+(?:[._-][a-z0-9]+)*{2,255}正則表達式也可以匹配無限字符,因為字符串與[a-z0-9]+匹配[a-z0-9]+可以有1個或多個字符。 (?:[._-][a-z0-9]+)*可以匹配零個或多個字符。 限制量詞{2,255}在這里並不能滿足您的需要。

要將輸入字符串的長度限制為2到255個字符,您必須使用在開頭處錨定的前瞻:

^(?=.{2,255}$)[a-z0-9]+(?:[._-][a-z0-9]+)*$
 ^^^^^^^^^^^^^

(?=.{2,255}$)預測將僅在字符串的開頭執行一次,只有在前瞻中的條件滿足時才會找到匹配:必須有2到255個字符( .匹配任何字符)除了換行符之外,它並不重要,因為您只允許匹配模式中的特定字符,直到字符串的結尾。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM