2017-04-03 32 views
1

我試圖解決密碼檢查挑戰,我已經到了一個字符串匹配兩個表達式的階段。RegEx如何檢查字符串的長度,同時也使用匹配組

規則:

  • 迴歸「太短」因爲這是少於6個字符
  • 任何字符串
  • 回報「沒關係」如果字符串少於12個字符,設有一個或多個下劃線,或一個數字,或者大寫/小寫字母

    var str = 'aBB33' 
    
    var lessthansixRegex = new RegExp(/^(?=.*?[a-z])(?=.*?[A-Z])|(?=.*?\d{1}){0,6}$/); 
    
    var okayRegex = new RegExp(/(?=.*?[a-z])(?=.*?[A-Z])|(?=.*?\d{1})|(?=.*?[_]{1})/); 
    
    if (okayRegex.test(str) && str.length < 12) { 
        return 'okay'; 
    } else if (tooshortRegex.test(str) && str.length < 6) { 
        return 'too short'; 
    } 
    

混合有沒有一種方法來檢查這個或者是C的PARAMATERS挑戰搞砸了。

您可能很容易發現的一個解決方案是缺少'',但'好的'正則表達式必須將該參數設置爲或'|'因爲還有其他字符串不需要匹配,也不包括''。

隨時讓我知道,如果你發現任何其他錯誤。

非常感謝!

+0

嗯,我只是習慣RegEx,所以我認爲這可能是一個很好的做法,嘗試使用RegEx檢查字符串長度。奇怪的是,如果我只使用string.length屬性,'好'的正則表達式仍然是匹配的。 – user6456392

+0

嗯......前面的樣子似乎通過了測試,比經典的^(樣式)$更多(我在到達這個之前試過了幾種方法) – user6456392

回答

1

通過對每個單獨的正則表達式測試達到您的解決方案,並提供基於每個條件的特定錯誤消息,我覺得你在這裏已經過於複雜的事情,爲什麼不檢查字符串的長度,而比寫一個正則表達式呢?此外,我覺得你的正則表達式可以更簡單:

var str = 'aBB33'; 

var okayRegex = /[_\d]|[A-Z]+.*[a-z]+|[a-z]+.*[A-Z]+/; 

if (str.length < 6 || str.length > 11) { 
    return 'password must be between 6 & 11 characters'; 
} else if (okayRegex.test(str)) { 
    return 'ok'; 
} else { 
    return 'invalid password'; 
} 

看到,因爲這是對正則表達式讓我解釋一下發生了什麼:

[_\d]   // match any underscore or digit (number) 
|    // or (checks whether what's before or after is true) 
[A-Z]+.*[a-z]+ // check for at least one A-Z followed by any gap 
       // of characters followed by at least one a-z 
|    // or 
[a-z]+.*[A-Z]+ // reverse of last check (lower then upper) 

希望幫助!

+0

非常感謝!我只是習慣RegEx,所以我認爲儘可能多地嘗試解決這個挑戰是有用的。我絕對不會在生產代碼中使用它。此外,字符串需要驗證一些事情,而不僅僅是長度。感謝您的解釋,特別是大寫/小寫模式的版本 - 我一直在努力,而且您的模式似乎很容易記住。 – user6456392

+0

再次感謝我使用混合解決方案和下面的解決方案來設法解決所有測試案例。感謝您激發對這個問題的不同思考方式。 – user6456392

1

你的正則表達式看起來太複雜了。你可以做這樣的事情

var containsNumber = new RegExp('\d'); 
var containsUnderscore = new RegExp('[_]'); 
var containsUpperCase = new RegExp('[A-Z]'); 
var containslowerCase = new RegExp('[a-z]');  

    if (str.length < 6 || str.length > 11) { 
    return 'password must be between 6 & 11 characters'; 
} else if (!containsNumber.test(str)) { 
    return 'password must contain a number'; 
}else if (!containsUnderscore.test(str)) { 
    return 'password must contain underscore'; 
}else if (!containsUpperCase.test(str)) { 
    return 'password must contain upper case character'; 
}else if (!containslowerCase.test(str)) { 
    return 'password must contain lower case character'; 
} 
+0

有趣......你的模式把問題當作一個警報用戶。挑戰實際上是將解決方案作爲一種視覺提示,所以你會顯示一個模式是否匹配。儘管感謝您的參與,但看到另一種處理模式的方式非常有用,我敢於嘗試將模式縮減爲更小的塊。 – user6456392

+1

再次感謝我使用了您的解決方案和上面的解決方案來解決所有的測試案例。感謝您激發對這個問題的不同思考方式。 – user6456392