4 回答

TA貢獻1876條經驗 獲得超5個贊
由于第一個前瞻模式,您的正則表達式失敗(?=^[a-z]+\d{2,})。字符串“astr1on11aut”以小寫字母開頭:
astr1on11aut
^^^^
這匹配^[a-z]+. 然而,模式的下一部分需要兩個或更多數字\d{2,},但字符串在該位置只有一個:
astr1on11aut
^^
||
digit -+|
+ --- not a digit
這會導致第一個先行模式失敗。
您可以使用三個前瞻更清晰地表達驗證規則:
“長度超過 5 個字符:
(?=.{5,})
“不要以數字開頭”:
^(?!\d)
“并且有兩個連續的數字”:
(?=.*\d{2})
如果我們把它們放在一起我們得到/(?=.{5,})(?!^\d)(?=.*\d{2})/
const regex = /^(?=.{5,})(?!\d)(?=.*\d{2})/;
test("abc");
test("123");
test("123abc");
test("abc123");
test("astr1on11aut");
test("., ;_'@=-%");
test("., ;_'@123=-%");
function test(string) {
console.log(`${string} : ${regex.test(string)}`);
}
請注意,此正則表達式不需要letter。嚴格遵循要求,唯一明確要求的是數字。由于未指定任何其他輸入的類型,因此它可以是任何內容(使用.
)。編寫正則表達式時最好不要做出太多假設,否則可能會阻止合法輸入。

TA貢獻1786條經驗 獲得超11個贊
如果您不限于使用單個正則表達式,我建議將其分成使用您的宿主語言(例如 JavaScript)的多個測試:
if (input.match(/^\D/)
&& input.match(/\d{2}/)
&& input.length >= 5) {
// password policy fulfilled
}

TA貢獻1842條經驗 獲得超22個贊
這對你有用嗎?
(?=^\D.{5,}$).*(?=\d{2,})
第一個先行斷言字符串不得以數字開頭,但長度至少為 6 個字符;第二個斷言必須至少有 2 個連續數字。
添加回答
舉報