2010-09-20 271 views
0

我需要創建一個正則表達式來匹配滿足以下三個條件中的任意兩個的字符串:至少一個大寫字母,至少一個小寫字母,至少一個數字。正則表達式檢查三個條件中的兩個

例如,下面的的結果:

"TestString" = MATCH (upper & lower) 
"TestSTring5" = MATCH (upper, lower, & number) 
"teststring" = NO MATCH (lower) 
"TESTSTRING" = NO MATCH (upper) 
"teststring5" = MATCH (lower & number) 
"345T" = MATCH (number & upper) 
+1

什麼正則表達式引擎? PCRE? JavaScript的? – 2010-09-20 20:35:01

+0

.net RegEx引擎。謝謝。 – Sako73 2010-09-20 20:37:50

回答

0

這將是一個巨大的正則表達式。

您需要測試這樣的事情(縮進的可讀性只):

"[a-z].*[A-Z]|" + 
"[A-Z].*[a-z]|" + 
"[A-Z].*[0-9]|" + 
"[0-9].*[A-Z]|" + 
"[a-z].*[0-9]|" + 
"[0-9].*[a-z]" 
+0

當客戶端決定密碼時,還需要至少有一個符號,並且在有效之前使用unicode範圍U + 0021-U + 007E會發生什麼?你的正則表達式需要更長的時間;) – 2010-09-20 21:04:58

+0

不幸的是,這是要求是什麼,爲簡單起見,我沒有包含它,但符號已經是一個要求。我不確定是否有一種方法可以使用預見組來壓縮它,或者我必須這樣做。謝謝您的幫助。 – Sako73 2010-09-20 21:27:47

0

它會更簡單,更容易,如果你創建的每個條件單獨的正則表達式來維持。

僞代碼:

reHasUpper = /[A-Z]/ ; 
reHasLower = /[a-z]/ ; 
reHasNumber = /[0-9]/ ; 

function validatePassword (pwd) { 

    metRequirements=0; 

    if (reHasUpper.test(pwd)) metRequirements++; 
    if (reHasLower.test(pwd)) metRequirements++; 
    if (reHasNumber.test(pwd)) metRequirements++; 

    return metRequirements > 1; 

} 
+0

我同意,但我需要把它全部放入一個RegEx。 – Sako73 2010-09-20 20:42:50

+0

請問爲什麼?由此產生的正則表達式應該是相當可憎的。 – 2010-09-20 20:47:05

+0

可能會猜測會有一個簡單的驗證引擎,它將正則表達式模式作爲參數 – 2010-09-20 20:53:09

0

我會嘗試沿着線的東西:

([a-z][A-Z]|[A-Z][a-z]|[a-z][0-9]|[0-9][a-z]|[A-Z][0-9]|[0-9][A-z]) 

這本質上做的是檢查任何對沿線:

  • a1
  • 1A
  • A1
  • 1A
  • AA
  • 機管局

在你的字符串。如果這些對中沒有一個匹配,則失敗。既然你正在尋找滿足三個標準中的任何兩個,那麼通過尋找匹配標準的字符對來工作。

+0

我會注意到這比其他解決方案更簡單,因爲這依賴於匹配可以發生在字符串內任何地方的事實。所以當你考慮你的三個標準和三個標準中只有兩個需要存在於字符串中的事實以及從一個標準到另一個標準的轉換髮生在字符串內的不同邊界的事實。但是,這與任何包含特殊字符(如_和@)以外的任何字符串都不匹配。 – 2010-09-20 21:53:25