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.

Resuelto Amarghosh asked hace 14 años • 4 respuestas

¿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?

Amarghosh avatar Oct 13 '09 18:10 Amarghosh
Aceptado

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, \Wpuede 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 avatar Oct 13 '2009 12:10 Bart Kiers

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.

Juan Furattini avatar Dec 05 '2017 19:12 Juan Furattini

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í .

Ensei_Tankado avatar Apr 11 '2022 10:04 Ensei_Tankado

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.

SilentGhost avatar Oct 13 '2009 12:10 SilentGhost