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条经验 获得超21个赞
这对你有用吗?
(?=^\D.{5,}$).*(?=\d{2,})
第一个先行断言字符串不得以数字开头,但长度至少为 6 个字符;第二个断言必须至少有 2 个连续数字。
添加回答
举报