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?
¿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
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 –
posible duplicado de [expresión RegEx para validar la cadena de entrada] (http://stackoverflow.com/questions/1124796/regex-expression-to-validate-the-input-string) –