RegEx para asegurarse de que la cadena contenga al menos un carácter en minúscula, un carácter en mayúscula, un dígito y un símbolo.
¿Cuál es la expresión regular para asegurarse de que una cadena determinada contenga al menos un carácter de cada una de las siguientes categorías?
- Minúscula
- Carácter en mayúscula
- Dígito
- Símbolo
Conozco los patrones de conjuntos individuales, a saber [a-z]
, [A-Z]
y\d
_|[^\w]
(los entendí correctamente, ¿no?).
Pero, ¿cómo los combino para asegurarme de que la cadena los contenga todos en cualquier orden?
Si necesita una sola expresión regular, intente:
(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*\W)
Una breve explicación:
(?=.*[a-z]) // use positive look ahead to see if at least one lower case letter exists
(?=.*[A-Z]) // use positive look ahead to see if at least one upper case letter exists
(?=.*\d) // use positive look ahead to see if at least one digit exists
(?=.*\W) // use positive look ahead to see if at least one non-word character exists
Y estoy de acuerdo con SilentGhost, \W
puede que sea un poco amplio. Lo reemplazaría con un conjunto de caracteres como este: [-+_!@#$%^&*.,?]
(¡siéntete libre de agregar más, por supuesto!)
Bart Kiers, tu expresión regular tiene un par de problemas. La mejor manera de hacerlo es esta:
(.*[a-z].*) // For lower cases
(.*[A-Z].*) // For upper cases
(.*\d.*) // For digits
(.*\W.*) // For symbols (non-word characters)
De esta manera estás buscando no importa si al principio, al final o a la mitad. En tu caso tengo muchos problemas con contraseñas complejas.
La solución de Bart Kier es buena, pero no rechaza cadenas que tienen espacios y acepta cadenas que tienen un guión bajo ( _
) como símbolo.
Mejorando la solución de Bart Kiers, aquí está la expresión regular:
(?=.*\d)(?=.*[a-z])(?=.*[A-Z])((?=.*\W)|(?=.*_))^[^ ]+$
Una breve explicación:
(?=.*[a-z]) // use positive look ahead to see if at least one lower case letter exists
(?=.*[A-Z]) // use positive look ahead to see if at least one upper case letter exists
(?=.*\d) // use positive look ahead to see if at least one digit exists
(?=.*\W) // use positive look ahead to see if at least one non-word character exists
(?=.*_) // use positive look ahead to see if at least one underscore exists
| // The Logical OR operator
^[^ ]+$ // Reject the strings having spaces in them.
Nota al margen: puede probar casos de prueba en una expresión regular aquí .
Puede unir esos tres grupos por separado y asegurarse de que todos estén presentes. Además, [^\w]
parece demasiado amplio, pero si eso es lo que desea, puede reemplazarlo con \W
.