2014-10-06 82 views
1

我正在建立一個密碼檢查器 - 我現在對至少三個小寫非連續字母有一個簡單的要求,要麼我對正則表達式有很大的誤解,要麼就是別的。爲什麼這個簡單的JavaScript密碼正則表達式不起作用?

我寫了下面的代碼:

var password = 'mYpAsSwOrD', 
    r = new RegExp('[a-z]{3,}', 'g'); 

console.log(password.match(r)); // null 
console.log(r.test(password)); // false 

而且,在 'G' 標記需要的?量詞不能有效地提供相同的功能嗎?

什麼是更好的比較?匹配字符串的正則表達式(第一個例子);或者用正則表達式來測試字符串(第二個例子)?

+1

'至少需要三個小寫字母'。你能解釋一下這部分嗎? – thefourtheye 2014-10-06 11:15:51

+0

'[a-z] {3,}'不符合國會大廈的字母或數字的專業字符。這是一個要求嗎? – vks 2014-10-06 11:16:37

+2

你目前的正則表達式目前正在檢查至少3 *連續*小寫字母。 – Jerry 2014-10-06 11:16:38

回答

2

它僅匹配具有至少3個小寫字母的字符串。

> /^(?:[^a-z]*[a-z]){3}/.test("mYpAsSwOrD") 
true 

說明:

  • ^斷言,我們是在開始。
  • (?..)被稱爲非捕獲組,它不會捕獲任何字符,但只會進行匹配操作。
  • [^a-z]*這將匹配任何字符零次或多次。
  • [a-z]這將匹配一個小寫字母。
  • (?:[^a-z]*[a-z]){3}所以如果整個非捕獲組重複三次,它可以匹配字符串與至少三個小寫字母。僅出於測試目的,我們不需要進行完整匹配。

OR

你可以試試下面的正預測先行。

^(?=(?:[^a-z]*[a-z]){3}) 

代碼:

> /^(?=(?:[^a-z]*[a-z]){3})/.test("mYpAsSwOrD") 
true 
+0

謝謝 - 你能擴展這個工作方式嗎?特別是'?:'語法? – keldar 2014-10-06 11:18:59

+0

肯定只需一分鐘。 – 2014-10-06 11:19:55

+0

@ Jonny5第一個需要13個步驟才能完成第二個預測是否需要15個步驟才能完成。 – 2014-10-06 11:40:23

1
(?=(.*?[a-z]){3}).* 

你可以試試this.See演示。

http://regex101.com/r/hQ1rP0/24

+0

太棒了!謝謝。你能解釋/擴大你的答案只是爲了描述語法嗎?我在 – keldar 2014-10-06 11:24:17

+1

@keldar之前還沒有遇到過?=語法它叫做積極lookahead.it在前面查找3個小寫字母的條件。 – vks 2014-10-06 11:27:50

+0

謝謝@vks - 我會看看 – keldar 2014-10-06 11:31:31

0

你原來的正則表達式匹配,其中這三個希望的文字是連續的。您可以在正則表達式改成這樣:

r = /[a-z](?:[^a-z]*[a-z]){2}/; 
  • [a-z]匹配一個小寫字母。
  • (?:[^a-z]*[a-z])跳過所有非小寫字符並嘗試匹配小寫字符。
    • {2}兩次。

至於你的其他問題,g標誌是沒有必要的,因爲它允許重複的比賽,而對於您的使用情況下,你只是簡單地比較第一收集和回報斷言如此。

相關問題