test strong special regular pattern password online number for regex passwords

special - regex strong password



Regex: "la contraseƱa debe tener al menos 3 de los 4 de los siguientes" (3)

La forma correcta de hacerlo es verificar las cinco condiciones por separado. Sin embargo, supongo que hay una razón por la que desea una expresión regular, aquí tiene:

/^((?=.*[A-Z])(?=.*[a-z])(?=.*/d)|(?=.*[a-z])(?=.*/d)(?=.*[/$/%/&])|(?=.*[A-Z])(?=.*/d)(?=.*[/$/%/&])|(?=.*[A-Z])(?=.*[a-z])(?=.*[/$/%/&])).{8,16}$/

Explicación:

  • Queremos hacer coincidir todo, por lo tanto, lo rodeamos con ^$
  • .{n,m} coincide entre n y m caracteres (8 y 16 en nuestro caso).
  • La forma general en que puede verificar si una cadena contiene algo, sin realmente igualarlo, es usar un análisis anticipado positivo (?=.*X) , donde X es lo que desea verificar. Por ejemplo, si desea asegurarse de que la cadena contiene una letra minúscula, puede hacer (?=.*[az]) .
  • Si desea verificar si una cadena contiene X , Y y Z , pero sin realmente combinarlas, puede usar la receta anterior añadiendo las tres cabeceras (?=.*X)(?=.*Y)(?=.*Z)
  • Usamos lo anterior para unir tres de las cuatro cosas mencionadas. Pasamos por todas las combinaciones posibles con | (o) - cCD|cDS|CDS|CcS ( c = letra minúscula, C = letra mayúscula, D = dígito, S = especial)

Véalo en acción

Soy un novato de Regex, y hasta ahora solo lo he usado para cosas simples, como "debe ser un número o una carta". Ahora tengo que hacer algo un poco más complejo.

Necesito usarlo para validar una contraseña, que debe tener 8-16 caracteres, sin caracteres de control / sin impresión / no ASCII, y debe tener al menos tres de los siguientes:

  • Una letra mayúscula
  • Una letra minúscula
  • un número 0-9
  • un carácter de símbolo ($,%, &, etc.)

Estoy pensando que lo que tengo que hacer es escribir algo como "una letra mayúscula, letra minúscula y número, O una mayúscula, minúscula y un símbolo, O una mayúscula, un número o un símbolo, O ... "para cubrir todas las combinaciones posibles" 3 de 4 ", pero eso parece excesivo. ¿Hay una solución más simple?


No estoy seguro si es una cosa de iOS, la expresión regular con "d" para los dígitos [0-9] no funcionaba como se esperaba, ejemplo String que tenía issues = "AAAAAA1 $"

El siguiente arreglo funciona bien en Objective-C y Swift 3

^((?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9])|(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[^a-zA-Z0-9])|(?=.*?[A-Z])(?=.*?[0-9])(?=.*?[^a-zA-Z0-9])|(?=.*?[a-z])(?=.*?[0-9])(?=.*?[^a-zA-Z0-9])).{8,16}$


La mejor forma de hacerlo es verificando cada condición por separado. El rendimiento sufrirá si intentas ajustar todos los criterios condicionales en una expresión (ver la respuesta aceptada). También recomiendo no limitar la longitud de la contraseña a 16 caracteres: esto es extremadamente inseguro para los estándares modernos. Pruebe algo más como 64 caracteres, o incluso mejor, 128, suponiendo que su arquitectura hash puede manejar la carga.

Tampoco especificó un idioma, pero esta es una forma de hacerlo en JavaScript:

var pws = [ "%5abCdefg", "&5ab", "%5abCdef", "5Bcdwefg", "BCADLKJSDSDFlk" ]; function pwCheck(pw) { var criteria = 0; if (pw.toUpperCase() != pw) { // has lower case letters criteria++; } if (pw.toLowerCase() != pw) { // has upper case letters criteria++; } if (/^[a-zA-Z0-9]*$/.test(pw) === false) { // has special characters criteria++; } if (//d/.test(pw) === true) { // has numbers criteria++; } // returns true if 3 or more criteria was met and length is appropriate return (criteria >= 3 && pw.length >= 8 && pw.length <= 16); } pws.forEach(function(pw) { console.log(pw + ": " + pwCheck(pw).toString()); });