Estoy creando una expresión regular para la validación de contraseña que se utilizará en una aplicación Java como parámetro de configuración.
La expresión regular es:
^.*(?=.{8,})(?=..*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%^&+=]).*$
La política de contraseñas es:
Al menos 8 caracteres
Contiene al menos un dígito
Contiene al menos un carácter alfa inferior y un carácter alfa superior
Contiene al menos un carácter dentro de un conjunto de caracteres especiales (
@#%$^
etc.)No contiene espacio, tabulación, etc.
Me falta solo el punto 5. No puedo hacer que la expresión regular verifique el espacio, la pestaña, el retorno de carro, etc.
¿Alguien podría ayudarme?
Respuestas:
Prueba esto:
Explicación:
Es fácil agregar, modificar o eliminar reglas individuales, ya que cada regla es un "módulo" independiente.
La
(?=.*[xyz])
construcción se come toda la cadena (.*
) y retrocede hasta la primera aparición donde[xyz]
puede coincidir. Tiene éxito si[xyz]
se encuentra, de lo contrario falla.La alternativa sería el uso de un calificativo renuente:
(?=.*?[xyz])
. Para una verificación de contraseña, esto apenas hará ninguna diferencia, para cadenas mucho más largas podría ser la variante más eficiente.La variante más eficiente (pero la más difícil de leer y mantener, por lo tanto la más propensa a errores) sería
(?=[^xyz]*[xyz])
, por supuesto. Para una expresión regular de esta longitud y para este propósito, no recomendaría hacerlo de esa manera, ya que no tiene beneficios reales.fuente
\\s
. Ese es un requisito de Java, no un requisito de expresiones regulares.(?=...)
patrón para que coincida con la configuración del resto de la expresión ..(?=\S+$)
) o "no contiene caracteres de espacio" ((?!.*\s)
) es una cuestión de preferencia. Usa lo que más te guste. :)ejemplo simple usando expresiones regulares
Explicaciones:
(?=.*[0-9])
un dígito debe aparecer al menos una vez(?=.*[a-z])
una letra minúscula debe aparecer al menos una vez(?=.*[A-Z])
una letra mayúscula debe aparecer al menos una vez(?=.*[@#$%^&+=])
un carácter especial debe aparecer al menos una vez(?=\\S+$)
no se permiten espacios en blanco en toda la cadena.{8,}
Al menos 8 carácteresfuente
Todas las respuestas dadas anteriormente usan la misma técnica (correcta) para usar una búsqueda anticipada separada para cada requisito. Pero contienen un par de ineficiencias y un error potencialmente masivo, dependiendo del back-end que realmente usará la contraseña.
Comenzaré con la expresión regular de la respuesta aceptada:
En primer lugar, dado que Java es compatible
\A
y\z
prefiero usarlos para asegurarme de que toda la cadena esté validada, independientemente dePattern.MULTILINE
. Esto no afecta el rendimiento, pero evita errores cuando se reciclan las expresiones regulares.Verificar que la contraseña no contenga espacios en blanco y verificar su longitud mínima se puede hacer en una sola pasada usando todo a la vez colocando el cuantificador variable
{8,}
en la abreviatura\S
que limita los caracteres permitidos:Si la contraseña proporcionada contiene un espacio, se realizarán todas las comprobaciones, solo para que la comprobación final falle en el espacio. Esto se puede evitar reemplazando todos los puntos con
\S
:El punto solo debe usarse si realmente desea permitir cualquier carácter. De lo contrario, use una clase de caracteres (negada) para limitar su expresión regular a solo aquellos caracteres que realmente están permitidos. Aunque hay poca diferencia en este caso, no usar el punto cuando otra cosa es más apropiada es un muy buen hábito. Veo demasiados casos de retroceso catastrófico porque el desarrollador fue demasiado vago para usar algo más apropiado que el punto.
Dado que hay una buena probabilidad de que las pruebas iniciales encuentren un carácter apropiado en la primera mitad de la contraseña, un cuantificador diferido puede ser más eficiente:
Pero ahora el tema realmente importante: ninguna de las respuestas menciona el hecho de que la pregunta original parece haber sido escrita por alguien que piensa en ASCII. Pero en Java, las cadenas son Unicode. ¿Se permiten caracteres que no son ASCII en las contraseñas? Si es así, solo se deshabilitan los espacios ASCII o se deben excluir todos los espacios en blanco Unicode.
De forma predeterminada
\s
, solo coincide con los espacios en blanco ASCII, por lo que su inverso\S
coincide con todos los caracteres Unicode (espacios en blanco o no) y todos los caracteres ASCII que no son espacios en blanco. Si se permiten caracteres Unicode pero no los espacios Unicode,UNICODE_CHARACTER_CLASS
se puede especificar la marca para\S
excluir los espacios en blanco Unicode. Si no se permiten caracteres Unicode, entonces[\x21-\x7E]
se pueden usar en lugar de\S
para hacer coincidir todos los caracteres ASCII que no sean un espacio o un carácter de control.Lo que nos lleva al siguiente problema potencial: ¿queremos permitir personajes de control? El primer paso para escribir una expresión regular adecuada es especificar exactamente lo que desea hacer coincidir y lo que no. La única respuesta 100% técnicamente correcta es que la especificación de la contraseña en la pregunta es ambigua porque no indica si ciertos rangos de caracteres como caracteres de control o caracteres no ASCII están permitidos o no.
fuente
No debe usar expresiones regulares demasiado complejas (si puede evitarlas) porque son
Aunque puede haber una pequeña sobrecarga de rendimiento al usar muchas expresiones regulares pequeñas, los puntos anteriores lo superan fácilmente.
Lo implementaría así:
fuente
Requisito de contraseña:
Las contraseñas deben incluir caracteres de al menos dos (2) de estas agrupaciones: caracteres alfabéticos, numéricos y especiales.
Lo probé y funciona
fuente
Para cualquier persona interesada en los requisitos mínimos para cada tipo de personaje, sugeriría hacer la siguiente extensión sobre la respuesta aceptada de Tomalak:
Tenga en cuenta que esta es una cadena de formato y no el patrón de expresión regular final. Simplemente sustituya% d con las ocurrencias mínimas requeridas para: dígitos, minúsculas, mayúsculas, no dígitos / caracteres y contraseña completa (respectivamente). Las ocurrencias máximas son poco probables (a menos que desee un máximo de 0, rechazando efectivamente cualquiera de esos caracteres), pero también se podrían agregar fácilmente. Observe la agrupación adicional alrededor de cada tipo para que las restricciones mínimas / máximas permitan coincidencias no consecutivas. Esto funcionó de maravilla para un sistema en el que podíamos configurar de forma centralizada cuántos de cada tipo de carácter requerimos y luego hacer que el sitio web, así como dos plataformas móviles diferentes, obtengan esa información para construir el patrón de expresiones regulares basado en la cadena de formato anterior.
fuente
Este busca cada carácter especial:
fuente
Método Java listo para ti, con parámetros
Simplemente copie y pegue y configure los parámetros deseados.
Si no desea un módulo, simplemente coméntelo o agregue un "si" como lo hice yo para un carácter especial
fuente
Utilice la biblioteca Passay , que es una potente API.
fuente
Creo que esto también puede hacerlo (como un modo más simple):
[Demostración de regex]
fuente
fácil
("^ (? =. * [0-9]) (? =. * [Az]) (? =. * [AZ]) (? =. * [\\ W _]) [\\ S] {8 , 10} $ ")
(? = cualquier cosa) -> significa una anticipación positiva en toda la cadena de entrada y asegúrese de que esta condición esté escrita .sample (? =. * [0-9]) -> significa asegurarse de que se escriba un número de dígito en toda la cadena. si no está escrito, devuelva falso .
(?! cualquier cosa) -> (viceversa) significa una mirada negativa hacia adelante si se escribe la condición return false .
significado cercano ^ (condición) (condición) (condición) (condición) [\ S] {8,10} $
fuente
Explicación:
fuente
También puedes hacer esto.
fuente
Bloque de código de muestra para contraseña segura:
fuente
La expresión regular es -
fuente