2009-10-13 19 views
107

¿Cuál es la expresión regular para asegurarse de que una cadena dada contiene al menos un carácter de cada una de las siguientes categorías.RegEx para asegurarse de que la cadena contiene al menos un carácter en minúscula, mayúscula, dígito y símbolo

  • minúscula
  • carácter
  • mayúsculas
  • dígito
  • Símbolo

Conozco las pautas de conjuntos individuales a saber [a-z], [A-Z], \d y _|[^\w] (Tengo ellas correcta, no me paré' t yo?).

Pero, ¿cómo los combino para asegurarme de que la cadena contiene todos estos en cualquier orden?

+0

¿Qué plataforma/regex-dialect? La respuesta de Bart es correcta, pero las aserciones anticipadas no son confiables en JavaScript, por ejemplo. – bobince

+0

En ninguna parte en particular, estoy aprendiendo regex. ¿Hay alguna alternativa que se pueda usar en javascript? – Amarghosh

+0

@bobince Hola, estoy tratando de descubrir por qué las aserciones futuras no son confiables en Javascript. ¿Hay algún comentario sobre esto? –

Respuesta

250

Si necesita una sola expresión regular, trate de:

^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*(_|[^\w])).+$ 

Una breve explicación:

^     // the start of the string 
(?=.*[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 underscore or non-word character exists 
.+     // gobble up the entire string 
$     // the end of the string 

Y estoy de acuerdo con SilentGhost, [_\W] podría ser un poco más amplio. Yo lo reemplazaría con un juego de caracteres como este: [[email protected]#$%^&*.,?] (¡no dude en agregar más, por supuesto!)

+5

Gracias de nuevo Bart. No estaba al tanto de una mirada positiva hacia adelante. – Amarghosh

+0

¿Qué pasaría si cambio el último '. +' En '. *'? No pude encontrar un caso de prueba que falla con '. *'. ¿Son ellos mismos en este contexto? "Cero o más personajes" parece estar bien, solo buscando confirmación. – Amarghosh

+0

@Amarghosh: en este caso, no hace ninguna diferencia. Debido a la apariencia positiva, la cadena ya contiene al menos 4 caracteres. Entonces no hace ninguna diferencia cambiar '. +' En '. *' O incluso '. {4,}' para el caso. –

4

Puede hacer coincidir 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 por \W.

+0

Gracias. No estaba al tanto de \ W. Solo lo busqué para encontrar que coincide con No palabra. ¿Hay alguna diferencia entre \ W y [\ W]? ¿Es [\ W] simplemente redundante? – Amarghosh

+0

@Amarghosh, sí, '\ W' y' [\ W] 'dan como resultado lo mismo. –

2

Bart Kiers, su expresión regular tiene un par de problemas. La mejor manera de hacerlo es la siguiente:

(.*[a-z].*)  // For lower cases 
(.*[A-Z].*)  // For upper cases 
(.*\d.*)   // For digits 

De esta manera usted está buscando, no importa si al principio, al final o en el medio. En tu caso tengo muchos problemas con contraseñas complejas.

Cuestiones relacionadas