簡體   English   中英

正則表達式恰好匹配n次出現的字母和m次出現的數字

[英]Regex to match exactly n occurrences of letters and m occurrences of digits

我必須匹配一個8個字符的字符串,它可以包含2個字母(1個大寫和1個小寫),正好是6個數字,但它們可以任意排列。

所以,基本上:

  • K82v6686會通過
  • 3w28E020會通過
  • 1276eQ900會失敗(太長時間)
  • 98Y78k9k會失敗(三個字母)
  • A09B2197會失敗(兩個大寫字母)

我已經嘗試使用正向前瞻來確保字符串包含數字,大寫和小寫字母,但是我將其限制為一定數量的出現時遇到了麻煩。 我想我可以通過包括字母和數字可能出現的所有可能組合來解決它:

(?=.*[0-9])(?=.*[A-Z])(?=.*[a-z]) ([A-Z][a-z][0-9]{6})|([A-Z][0-9][a-z][0-9]{5})| ... | ([0-9]{6}[a-z][A-Z])

但這是一種非常迂回的方式,我想知道是否有更好的解決方案。

您可以使用

^(?=[^A-Z]*[A-Z][^A-Z]*$)(?=[^a-z]*[a-z][^a-z]*$)(?=(?:\D*\d){6}\D*$)[a-zA-Z0-9]{8}$

請參閱正則表達式演示 (由於多行輸入而稍有修改)。 在Java中,不要忘記使用雙反斜杠(例如\\\\d匹配一個數字)。

這是一個細分:

  • ^ - 字符串的開頭(假設不使用多行標志)
  • (?=[^AZ]*[AZ][^AZ]*$) - 檢查是否只有1個大寫字母(使用\\p{Lu}匹配任何Unicode大寫字母和\\P{Lu}匹配任何字符除此之外)
  • (?=[^az]*[az][^az]*$) - 類似檢查是否只有1個小寫字母(或者,使用\\p{Ll}\\P{Ll}來匹配Unicode字母)
  • (?=(?:\\D*\\d){6}\\D*$) - 檢查字符串中是否有六位數字(=從字符串的開頭,可以有0個或更多的非數字符號( \\D匹配除數字之外的任何字符,您也可以用[^0-9]替換它,然后是數字( \\d ),然后是0或更多非字母字符( \\D* ),直到字符串( $ )的結尾然后
  • [a-zA-Z0-9]{8} - 恰好匹配8個字母數字字符。
  • $ - 結束字符串。

按照邏輯,我們甚至可以減少這一點

^(?=[^a-z]*[a-z][^a-z]*$)(?=(?:\D*\d){6}\D*$)[a-zA-Z0-9]{8}$

可以刪除一個條件,因為我們只允許使用[a-zA-Z0-9]小寫和大寫字母和數字,當我們應用2個條件時,第3個條件在匹配字符串時自動執行(一個字符必須是大寫的在這種情況下)。

當使用Java matches()方法時,不需要在模式的開頭和結尾使用^$ anchors,但是在前瞻中你仍然需要它:

String s = "K82v6686";
String rx = "(?=[^a-z]*[a-z][^a-z]*$)" +      // 1 lowercase letter check
            "(?=(?:\\D*\\d){6}\\D*$)" +       // 6 digits check
            "[a-zA-Z0-9]{8}";                 // matching 8 alphanum chars exactly
if (s.matches(rx)) {
    System.out.println("Valid"); 
} 
Pattern.matches(".*[A-Z].*", s) &&
Pattern.matches(".*[a-z].*", s) &&
Pattern.matches(".*(\\D*\\d){6}.*", s) &&
Pattern.matches(".{8}", s)

由於我們需要為此任務創建交替自動機 ,因此使用正則表達式的組合來構造字符類型要簡單得多。

我們要求它至少有一個小寫字母,一個大寫字母和6個數字,這三個類是互斥的。 在最后一個條件下,我們要求字符串的長度恰好是這些數字的總和,這樣就不會留出超出所需類型的額外字符的空間。 當然我們可能會說s.lenght() == 8作為最后一個條件,但這會打破風格:)。

詞法排序字符串,然后匹配^(?:[az][AZ]|[AZ][az])[0-9]{6}$

暫無
暫無

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

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