2014-09-30 62 views
3

我試圖在一個正則表達式中包含兩個積極的lookaheads。以下是我正在處理的問題。JavaScript正則表達式中的多個積極lookaheads的語法

(?=[a-zA-Z])(?=[0-9])[a-zA-Z0-9]{0,20} 

這就是我想要匹配:

  • 0-20個字符
  • 一個或多個字母的任何地方
  • 一個或多個號碼的任何地方
  • 只有字母和數字允許

當我這樣做只有一個看前進,它的工作原理,但只要我添加另一個,它就會中斷。兩個lookahead的正確語法是什麼?

+2

這個怎麼樣'(?=。* [A-ZA-Z])(?=。* [0-9]) [A-ZA-Z0-9] {0,20}'? – revo 2014-09-30 20:19:01

+0

謝謝!這很奇妙! – Qaz 2014-09-30 20:21:33

+0

注意,不允許使用下劃線。您需要'[a-zA-Z0-9 _] {0,20}',它與'\ w {0,20}'同義。 – Sam 2014-09-30 20:22:01

回答

6

Lookaheads就像漫遊!你以不滿足的第一位限制了相貌。因此,使用貪婪的.*(或懶惰)量詞將允許向前查找每個斷言。

由於@AlexR在評論中提到我修改正則表達式一點點:

(?=.*[a-zA-Z])(?=.*[0-9])[a-zA-Z0-9_]{0,20}$ 

順便說一句,你忘了匹配下劃線,這是我補充道。

1

當輸入過長時,會出現@revos回答問題:A會通過預測和最終檢查。固定版本或者檢查結束字符串^$或使用可變長度環視(或兩者):

^(?=.{0,19}[a-zA-Z])(?=.{0,19}[0-9])[a-zA-Z0-9]{0,20}$ // (1), (1*) without^
^(?=.*[a-zA-Z])(?=.*[0-9])[a-zA-Z0-9]{0,20}$ 
(?=.{0,19}[a-zA-Z])(?=.{0,19}[0-9])[a-zA-Z0-9]{0,20} // (2) 

只有後者將允許指定的字符串周圍的文本。省略前變種^將允許密碼爲前綴,即

Input   : "Password1 = ASDF0123" 
Matches with (1) : none 
Matches with (1*): "ASDF0123" 
Matches with (2) : "Password1", "ASDF0123" 
+0

提出一個非常有趣的案例。因爲我將在表單中使用它,所以我可以爲輸入標記添加maxlength =「20」屬性。沒有這個,我不會意識到我需要這個。 – Qaz 2014-09-30 20:44:34

+0

@Qaz我仍然會推薦使用更嚴格的正則表達式,因爲像FireBug這樣的工具允許編輯客戶端,所以您永遠無法確定您的表單POST(或GET)是否理智,因爲它受控於您的(可能是惡意的)客戶端。 – AlexR 2014-09-30 20:53:07

+0

無論我如何確定正則表達式,在客戶端編輯它都非常容易 - 我正確地將它放在HTML中! ()不過,別擔心。這只是爲了用戶的利益,所以他們知道他們的密碼是否符合規則。我會在客戶端進行認真的檢查。也不要擔心密碼規則的不安全程度;這不是生產。 – Qaz 2014-09-30 21:03:17