2011-05-17 18 views
7
  1. Contiene al menos 8 caracteres.
  2. Contiene mayúsculas y minúsculas.
  3. Contiene números u otros caracteres no alfabéticos.

¿Cuál podría ser el reg ex para los criterios anteriores?Regex para al menos 8 + números + superiores e inferiores u otros no alfabéticos

Estoy creando un cheque por contraseña más fuerte :)

C# estoy usando

+0

¿Tienes que usar Regex para esto? No tengo nada en contra, pero en el criterio 1 podría ser más fácil usar una función de longitud de cadena en su lugar. ¿En qué idioma está esto? – chillysapien

+2

Esta no es una respuesta a su pregunta, pero me gustaría recomendar algunas lecturas sobre por qué forzar a los usuarios a tener el tipo de contraseña que está buscando es una mala práctica: http://www.baekdal.com/tips/password- seguridad-usabilidad –

+1

posible duplicado de [expresión RegEx para validar la cadena de entrada] (http://stackoverflow.com/questions/1124796/regex-expression-to-validate-the-input-string) –

Respuesta

13

Esto debe hacerlo:

(?=.*?[a-z])(?=.*?[A-Z])(?=.*?[^a-zA-Z]).{8,} 

Ver aquí: rubular

Explicación:

(?=.*?[a-z]) //lookahead, there has to be a lower case alphabetic char 
(?=.*?[A-Z]) //lookahead, there has to be a upper case alphabetic char 
(?=.*?[^a-zA-Z]) //lookahead, there has to be a non-alphabetic char 
.{8,} // any character at least 8 times 
+0

qué conjunto de elementos especifica ¿fletadores especiales aquí? –

+0

[^ a-zA-Z] significa cualquier cosa menos caracteres alfabéticos. – morja

11

No intente utilizar una expresión regular para todas las reglas, es difícil y, lo que es más importante, será difícil de leer y modificar por futuros programadores. En cambio, escriba una función para cada regla. Use una función de longitud de cadena para la primera regla, luego use expresiones regulares separadas (o un simple escaneo de la cadena) para letras mayúsculas, minúsculas y números.

Su prueba se convierte en algo así como:

if (len(password) >= 8 && 
    contains_lower(password) && 
    contains_upper(password) && 
    contains_number(password)) { 
    ... 
} 

Su código se vuelve absolutamente claro en su intención, y si usted tiene que cambiar sólo una parte del algoritmo que no tiene que reinventar una expresión regular compleja . Además, podrás probar cada regla de manera independiente.

Compare esto con un ejemplo que alguien escribió en otra respuesta a esta pregunta:

(?=.*?[a-z])(?=.*?[A-Z])(?=.*?[^a-zA-Z]).{8,} 

¿Cuál de estas dos respuestas parece más fácil de entender, fácil de modificar y fáciles de probar? Ni siquiera puedes adivinar lo que está haciendo la expresión regular hasta que pases unos pocos (o muchos) momentos estudiándola. ¿Y qué pasa si el requisito cambia a "... y tiene al menos un guión bajo"? ¿Cómo se cambia el patrón, especialmente cuando usted no fue el que se le ocurrió el patrón para empezar?

+0

+1 fantástico - ¡No sé por qué no pensé en esto antes de 10000000x más claro! – Dori

+0

Otra razón importante para no usar expresiones regulares es que hacen que sea imposible decirle al usuario qué parte de sus requisitos no cumple su contraseña –

Cuestiones relacionadas