我需要密码才能满足这些要求
它似乎不适用于此
var pos = myPass.value.search(/^([\w.-]{8,})(?=.*\d)((.*?[A-Z]){2,})$/);
No.3是最难的。
答案 0 :(得分:0)
您正在混合消费和非消费模式,将限制量词添加到与序列匹配的消费模式,而您需要检查,如果字符串符合某些限制条件模式与否。要添加这些限制,您需要 lookaheads 。 (?=.*\d)
是你的正则表达式的正确部分,其他都不是。
此外,RegExp#test()
是检查字符串是否匹配的更好方法。
使用
/^(?=\D*\d)(?=(?:(?:^|[^A-Z]+)[A-Z]){2}).{8,}$/.test(myPass.value)
请参阅regex demo
或者,只允许密码中的字母,数字,下划线,点和连字符:
/^(?=\D*\d)(?=(?:(?:^|[^A-Z]+)[A-Z]){2})[\w.-]{8,}$/.test(myPass.value)
^^^^^^
<强>详情:
^
- 字符串开头(?=\D*\d)
- 在字符串开头的0位以上非数字(\D*
)之后,必须有一个数字(\d
)(请注意,在执行此前瞻后,正则表达式索引仍然在字符串的开头)(?=(?:(?:^|[^A-Z]+)[A-Z]){2})
- 必须有2个序列((?:...){2}
):
(?:^|[^A-Z]+)
- 字符串的开头或大写字母以外的一个或多个字符[A-Z]
- 大写字母。.{8,}
- 除了换行符序列中使用的字符之外的任何8个或更多字符
[\w.-]{8,}
- 8个或更多ASCII字母和数字,下划线,点或连字符$
- 字符串结束。