2017-04-03 65 views
0

我必須寫的正則表達式來檢查,如果字符串:正則表達式複雜圖案

  • 長度爲5-15個字符長
  • 具有至少2個大寫字母
  • 具有至少2個小寫字母
  • 並有1位數字

我欣賞任何幫助,因爲我真的堅持這一點,並沒有任何想法如何解決這個問題。

回答

5

您可以使用向前看檢查所有條件,然後匹配5至15個字符(任何),確保沒有別的(^$):

^(?=(?:.*[A-Z]){2})(?=(?:.*[a-z]){2})(?=.*\d).{5,15}$

  • ^:字符串開頭
  • (?= ):積極展望未來。不抓住任何字符,但只是看向前看,如果模式將匹配
  • (?: ):使該組無法捕獲,即你不會得到它作爲捕獲組,您可以參考$1\1(語言依賴性)
  • .*[A-Z]:0或更多字符(S),隨後由大寫字母
  • .*[a-z]:0或更多字符(S),接着是小寫字母
  • .*\d:0或更多字符(S),隨後由一個數字
  • {2}:p上一圖案必須匹配兩次
  • .{5-15}:5至15個字符。
  • $:字符串的結尾

在JavaScript中,你可以測試一個字符串中的正則表達式與test,例如:

var regex = /^(?=(?:.*[A-Z]){2})(?=(?:.*[a-z]){2})(?=.*\d).{5,15}$/; 
 

 
console.log(regex.test('a9B1c')); // false, missing capital letter 
 
console.log(regex.test('a9B1cD')); // true

+0

謝謝,我最近開始使用正則表達式,從未聽過或用過前瞻。 –

0

trinctot是正確的第一次,但取決於誰在使用你的代碼和什麼,這可能更容易維護/修改:

var lowerPass = 2 <= (string.match(/[a-z]/g) || []).length; 
var upperPass = 2 <= (string.match(/[A-Z]/g) || []).length; 
var digitPass = 1 <= (string.match(/[0-9]/g) || []).length; 
var lengthPass = 5 <= string.length <= 15; 

var stringPass = lowerPass + upperPass + digitPass + lengthPass == 4;