在密码策略中,有4项要求。它应该包含以下任何三个
以下正则表达式将匹配所有情况
^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[^a-zA-Z0-9]).{4,8}$我知道我可以用‘\’来声明所有的组合,但是,这会产生一个超长的正则表达式。为了检查输入是否包含组合中的三个条件中的任何一个条件,什么是最好的方法来替换‘AC.26’?
发布于 2014-11-18 13:00:01
如果您使用的是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}$基于德布盖克斯的演示
JavaScript regex风味不支持递归(它实际上不支持许多东西)。最好使用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}$");
};发布于 2014-11-18 12:33:15
当然,这里有一个方法,它对相同的regex进行了轻微的修改,但是需要少量的代码编写。
^(?=(\D*\d)|)(?=([^a-z]*[a-z])|)(?=([^A-Z]*[A-Z])|)(?=([a-zA-Z0-9]*[^a-zA-Z0-9])|).{4,8}$这里有五个捕获组--检查其中至少有3个不是null。用于捕获的空组有效地指示查找内的备选方案已经匹配,而左手侧的捕获组无法匹配。
例如,在PHP中:
preg_match("/^(?=(\\D*\\d)|)(?=([^a-z]*[a-z])|)(?=([^A-Z]*[A-Z])|)(?=([a-zA-Z0-9]*[^a-zA-Z0-9])|).{4,8}$/", $str, $matches);
$count = -1; // Because the zero-eth element is never null.
foreach ($matches as $element) {
if ( !empty($element)) {
$count += 1;
}
}
if ($count >= 3) {
// ...
}或者Java:
Matcher matcher = Pattern.compile(...).matcher(string);
int count = 0;
if (matcher.matches())
for (int i = 1; i < 5; i++)
if (null != matcher.group(i))
count++;
if (count >= 3)
// ...https://stackoverflow.com/questions/26991679
复制相似问题