我試圖在一個正則表達式中包含兩個積極的lookaheads。以下是我正在處理的問題。JavaScript正則表達式中的多個積極lookaheads的語法
(?=[a-zA-Z])(?=[0-9])[a-zA-Z0-9]{0,20}
這就是我想要匹配:
- 0-20個字符
- 一個或多個字母的任何地方
- 一個或多個號碼的任何地方
- 只有字母和數字允許
當我這樣做只有一個看前進,它的工作原理,但只要我添加另一個,它就會中斷。兩個lookahead的正確語法是什麼?
我試圖在一個正則表達式中包含兩個積極的lookaheads。以下是我正在處理的問題。JavaScript正則表達式中的多個積極lookaheads的語法
(?=[a-zA-Z])(?=[0-9])[a-zA-Z0-9]{0,20}
這就是我想要匹配:
當我這樣做只有一個看前進,它的工作原理,但只要我添加另一個,它就會中斷。兩個lookahead的正確語法是什麼?
Lookaheads就像漫遊!你以不滿足的第一位限制了相貌。因此,使用貪婪的.*
(或懶惰)量詞將允許向前查找每個斷言。
由於@AlexR在評論中提到我修改正則表達式一點點:
(?=.*[a-zA-Z])(?=.*[0-9])[a-zA-Z0-9_]{0,20}$
順便說一句,你忘了匹配下劃線,這是我補充道。
當輸入過長時,會出現@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"
提出一個非常有趣的案例。因爲我將在表單中使用它,所以我可以爲輸入標記添加maxlength =「20」屬性。沒有這個,我不會意識到我需要這個。 – Qaz 2014-09-30 20:44:34
@Qaz我仍然會推薦使用更嚴格的正則表達式,因爲像FireBug這樣的工具允許編輯客戶端,所以您永遠無法確定您的表單POST(或GET)是否理智,因爲它受控於您的(可能是惡意的)客戶端。 – AlexR 2014-09-30 20:53:07
無論我如何確定正則表達式,在客戶端編輯它都非常容易 - 我正確地將它放在HTML中! ()不過,別擔心。這只是爲了用戶的利益,所以他們知道他們的密碼是否符合規則。我會在客戶端進行認真的檢查。也不要擔心密碼規則的不安全程度;這不是生產。 – Qaz 2014-09-30 21:03:17
這個怎麼樣'(?=。* [A-ZA-Z])(?=。* [0-9]) [A-ZA-Z0-9] {0,20}'? – revo 2014-09-30 20:19:01
謝謝!這很奇妙! – Qaz 2014-09-30 20:21:33
注意,不允許使用下劃線。您需要'[a-zA-Z0-9 _] {0,20}',它與'\ w {0,20}'同義。 – Sam 2014-09-30 20:22:01