0

Necesito comprobar que un valor(clave) tiene:

  • Mínimo 8 caracteres.
  • Mayúsculas y minúsculas.
  • Números.
  • Puede contener ! o ?, pero ningún otro carácter especial.

Hasta ahora tengo lo siguiente:

function enRango(x, min, max) {
    return ((x - min) * (x - max) <= 0);
}

const clave = document.getElementById('clave');

function comprobarContraseña(clave) {
  let resul = 0;
  for (let i = 0; i < clave.length; i++) {
    if (!enRango(clave.charCodeAt(i), 34, 47) || !enRango(clave.charCodeAt(i), 58, 62)) {
      if (minusculas.test(clave)) {
        if (numeros.test(clave)) {
          resul = 1;
          console.log('has entrado hasta el final');
          return resul;
        }
      }
    } else {
      resul = 1;
      return resul;
    }
    if (minusculas.test(clave) && numeros.test(clave)) {
      console.log('estas en el minusculas y numeros');
      return resul;
    }
  }
}

minusculas y numeros son dos expresiones regulares que he creado, pero al no tener mucho conocimiento en la materia creo que tengo algún fallo a la hora de comprobar.

const minusculas = new RegExp('^[a-z]+$');
const numeros = new RegExp('^[0-9]+$');

Creo que puede comprobarse todo directamente con una Expresión Regular pero no sé exactamente como hacerlo.

Mauricio Contreras
  • 13,660
  • 3
  • 18
  • 40
Jorch13_13
  • 401
  • 2
  • 13
  • Por qué crees que tienes un fallo? Falla? Probaste el código? qué error encuentas? – Alfabravo Dec 09 '21 at 22:12
  • Si le paso un texto que tenga mas de 8 en longitud me lo da correcto. Si meto cualquier carácter especial me lo reconoce bien igual. Basicamente no compruba bien por la funcion comprobarContraseña, en ésta habrá algun error. – Jorch13_13 Dec 09 '21 at 22:15
  • Ninguna de las expresiones o validaciones que tiene ese método comprueba la longitud de la contraseña y eso no necesita una expresión regular. Eso _falta_. Lo otro es que valides POR SEPARADO cada atributo de la contraseña para no complicar lo que puede ser simple. Valida que tenga minúsculas y retorna algo cuando no se cumpla, luego mayúsculas y lo mismo, luego números... – Alfabravo Dec 09 '21 at 22:19

1 Answers1

2

las validaciones las debes hacer una por una, para ello te recomiendo guiarte de la referencia de expresiones regulares.

No es que en teoría no puedas lograrlo en una sola expresión regular, pero será mucho más complejo.

Para unir todas las validaciones usa el operador lógico &&.

Hay dos formas de definir una expresión regular en javascript, la que pusiste en la que debes de escapar los caracteres y la forma ya escapada, donde pones tu expresión regular entre slashes (/)

Para verificar si una validación se cumple con algún texto a tu expresión regular le llamas su método test y su parámetro debe ser una cadena.

Al final te quedará algo así:

function comprobarContraseña(el) {
  const clave = el.value;
  const ochocaracteres = /.{8,}/.test(clave)
  console.log("contiene al menos 8 caracteres:", ochocaracteres)
  const mayymin = /(?:[A-Z])/.test(clave) && /(?:[a-z])/.test(clave)
  console.log("Mayusculas y minusculas:", mayymin)
  const numeros = /(?:\d)/.test(clave)
  console.log("números:", numeros)
  const noespecial = !/[^!?A-Za-z\d]/.test(clave)
  console.log("contiene ! o ?, pero no otro caracter especial:", noespecial)
  const valida=ochocaracteres && mayymin && numeros && noespecial
  console.log("contraseña válida:", valida, "\n\n");
}
<input onkeyup="comprobarContraseña(this)" />
Ruslan López
  • 10,060
  • 11
  • 35
  • 68