在密码策略中,有4个要求。 它应该包含以下任何三个
- 小写。
- 大写。
- 数字。
- 特殊字符。
以下正则表达式将匹配所有情况
^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[^a-zA-Z0-9]).{4,8}$
我知道我可以使用'|'然而,声明所有组合,这将产生一个超长的正则表达式。替换'|'的最佳方法是什么以便它可以检查输入是否包含组合中的三个条件中的任何一个?
最佳答案
如果您使用的是 PCRE 风格,则以下内容可以满足您的需求(为了便于阅读而格式化):
^(?:
((?=.*\d))((?=.*[a-z]))((?=.*[A-Z]))((?=.*[^a-zA-Z0-9]))|
(?1) (?2) (?3) |
(?1) (?2) (?4) |
(?1) (?3) (?4) |
(?2) (?3) (?4)
).{4,8}$
单行:
^(?:((?=.*\d))((?=.*[a-z]))((?=.*[A-Z]))((?=.*[^a-zA-Z0-9]))|(?1)(?2)(?3)|(?1)(?2)(?4)|(?1)(?3)(?4)|(?2)(?3)(?4)).{4,8}$
演示 Debuggex
JavaScript 正则表达式风格不支持递归(它实际上不支持很多事情)。最好改用 4 个不同的正则表达式,例如:
var validate = function(input) {
var regexes = [
"[A-Z]",
"[a-z]",
"[0-9]",
"[^a-zA-Z0-9]"
];
var count = 0;
for (var i = 0, n = regexes.length; i < n; i++) {
if (input.match(regexes[i])) {
count++;
}
}
return count >=3 && input.match("^.{4,8}$");
};
关于javascript - 匹配至少四分之三的正则表达式要求的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26991679/