special - regex strong password
Regex: "la contraseƱa debe tener al menos 3 de los 4 de los siguientes" (3)
La forma correcta de hacerlo es verificar las cinco condiciones por separado. Sin embargo, supongo que hay una razón por la que desea una expresión regular, aquí tiene:
/^((?=.*[A-Z])(?=.*[a-z])(?=.*/d)|(?=.*[a-z])(?=.*/d)(?=.*[/$/%/&])|(?=.*[A-Z])(?=.*/d)(?=.*[/$/%/&])|(?=.*[A-Z])(?=.*[a-z])(?=.*[/$/%/&])).{8,16}$/
Explicación:
- Queremos hacer coincidir todo, por lo tanto, lo rodeamos con
^$
-
.{n,m}
coincide entren
ym
caracteres (8 y 16 en nuestro caso). - La forma general en que puede verificar si una cadena contiene algo, sin realmente igualarlo, es usar un análisis anticipado positivo
(?=.*X)
, dondeX
es lo que desea verificar. Por ejemplo, si desea asegurarse de que la cadena contiene una letra minúscula, puede hacer(?=.*[az])
. - Si desea verificar si una cadena contiene
X
,Y
yZ
, pero sin realmente combinarlas, puede usar la receta anterior añadiendo las tres cabeceras(?=.*X)(?=.*Y)(?=.*Z)
- Usamos lo anterior para unir tres de las cuatro cosas mencionadas. Pasamos por todas las combinaciones posibles con
|
(o) -cCD|cDS|CDS|CcS
(c
= letra minúscula,C
= letra mayúscula,D
= dígito,S
= especial)
Soy un novato de Regex, y hasta ahora solo lo he usado para cosas simples, como "debe ser un número o una carta". Ahora tengo que hacer algo un poco más complejo.
Necesito usarlo para validar una contraseña, que debe tener 8-16 caracteres, sin caracteres de control / sin impresión / no ASCII, y debe tener al menos tres de los siguientes:
- Una letra mayúscula
- Una letra minúscula
- un número 0-9
- un carácter de símbolo ($,%, &, etc.)
Estoy pensando que lo que tengo que hacer es escribir algo como "una letra mayúscula, letra minúscula y número, O una mayúscula, minúscula y un símbolo, O una mayúscula, un número o un símbolo, O ... "para cubrir todas las combinaciones posibles" 3 de 4 ", pero eso parece excesivo. ¿Hay una solución más simple?
No estoy seguro si es una cosa de iOS, la expresión regular con "d" para los dígitos [0-9] no funcionaba como se esperaba, ejemplo String que tenía issues = "AAAAAA1 $"
El siguiente arreglo funciona bien en Objective-C y Swift 3
^((?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9])|(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[^a-zA-Z0-9])|(?=.*?[A-Z])(?=.*?[0-9])(?=.*?[^a-zA-Z0-9])|(?=.*?[a-z])(?=.*?[0-9])(?=.*?[^a-zA-Z0-9])).{8,16}$
La mejor forma de hacerlo es verificando cada condición por separado. El rendimiento sufrirá si intentas ajustar todos los criterios condicionales en una expresión (ver la respuesta aceptada). También recomiendo no limitar la longitud de la contraseña a 16 caracteres: esto es extremadamente inseguro para los estándares modernos. Pruebe algo más como 64 caracteres, o incluso mejor, 128, suponiendo que su arquitectura hash puede manejar la carga.
Tampoco especificó un idioma, pero esta es una forma de hacerlo en JavaScript:
var pws = [
"%5abCdefg",
"&5ab",
"%5abCdef",
"5Bcdwefg",
"BCADLKJSDSDFlk"
];
function pwCheck(pw) {
var criteria = 0;
if (pw.toUpperCase() != pw) {
// has lower case letters
criteria++;
}
if (pw.toLowerCase() != pw) {
// has upper case letters
criteria++;
}
if (/^[a-zA-Z0-9]*$/.test(pw) === false) {
// has special characters
criteria++;
}
if (//d/.test(pw) === true) {
// has numbers
criteria++;
}
// returns true if 3 or more criteria was met and length is appropriate
return (criteria >= 3 && pw.length >= 8 && pw.length <= 16);
}
pws.forEach(function(pw) {
console.log(pw + ": " + pwCheck(pw).toString());
});