2011-01-19 104 views
0

下面的正則表達式現在寫成需要大寫字母。我剛纔被告知大寫字母是可選的,但不是必需的。如何在不改變任何其他參數的情況下編寫這個正則表達式來不至少需要一個大寫字母。需要此正則表達式不要求至少有1個大寫字母

/^(?:(?!([a-zA-Z0-9-().&@?""#,+''\s\/])\1\1)[a-zA-Z0-9-().&@?""#,+''\s\/]){7,}$/ 
+2

**這**是爲什麼你不寫出巨大的不可理解的正則表達式,但只有當他們產生最可讀的解決方案時使用它們的小劑量。 – delnan 2011-01-19 21:47:08

回答

4

這正則表達式已經不需要一個大寫字符。它所堅持的唯一「有趣」的事情是,字符串不能以重複3次的同一個事物(即相同的字符)開始,而整個字符串至少需要7個字符長。

此外,正則表達式中單引號和雙引號字符的倍數是不必要的。

3

該正則表達式中沒有任何內容需要大寫字母。該正則表達式的要求是:

  • 至少7個字符長。
  • 僅包含大寫和小寫字母,數字0-9,符號-().&@?"#,+',空格或/
  • 不是以連續3個相同的字符開頭。 (作者可能希望此檢查適用於整個密碼,但它不會)。

如果我沒有弄錯,這似乎是用於密碼驗證。由於以下幾個原因,這對於正則表達式的使用很差。

  1. 這很難讀。正確的檢查是什麼?這一大堆人物實際上做了什麼?如果你不是一個正則表達式專家,這是胡言亂語。

  2. 它有幾個需求塞進一個大的正則表達式。如果檢查被分成幾行代碼會更容易閱讀和更易於維護:

    if (password.length < 7)     reject("Too short."); 
    if (numRepeatedCharacters(password) >= 3) reject("Too repetitive."); 
    if (numDigits(password) < 1)    reject("Digit required."); 
    if (numSymbols(password) < 1)    reject("Symbol required."); 
    // etc. 
    
  3. 它包含一個字符的白名單,而不是黑名單。請勿將字符列入白名單。沒有理由阻止用戶使用你沒有想到的字符。如果他們想使用星號,百分號,重音字母等,該怎麼辦?你會因爲沒有良好的安全原因而拒絕這些角色。

相關問題