Foro de elhacker.net

Programación => Desarrollo Web => Mensaje iniciado por: Leguim en 13 Junio 2022, 18:23 pm



Título: [Pregunta]: Expresión regular para formato serial "12345-ABCDE-12345"
Publicado por: Leguim en 13 Junio 2022, 18:23 pm
Hola, estoy teniendo problemas con una expresión regular donde se reemplazarán los valores con vacío donde no cumpla el formato de un serial.
"12345-ABCDE-12345" Es decir, 5 números seguidos de un guión medio seguidos de 6 letras mayúsculas de la A a la Z, nuevamente un guión medio y otros 5 numeros.

Código
  1. $('#form_verify_email').on('keyup', function(e)
  2. {
  3.       if($('input[name=input_code_email]').is(e.target))
  4.       {
  5.              form_verify_email.input_code_email.value = String(form_verify_email.input_code_email.value.substring(0, 5)).replace(/[^0-9]+/g, '');
  6.              form_verify_email.input_code_email.value = (form_verify_email.input_code_email.value)+String(form_verify_email.input_code_email.value.substring(5, 6)).replace(/[^-]+/g, '');
  7.              form_verify_email.input_code_email.value = (form_verify_email.input_code_email.value)+String(form_verify_email.input_code_email.value.substring(6, 11)).replace(/[^A-Z]+/g, '');
  8.              form_verify_email.input_code_email.value = (form_verify_email.input_code_email.value)+String(form_verify_email.input_code_email.value.substring(11, 12)).replace(/[^-]+/g, '');
  9.              form_verify_email.input_code_email.value = (form_verify_email.input_code_email.value)+String(form_verify_email.input_code_email.value.substring(12, 17)).replace(/[^0-9]+/g, '');
  10.        }
  11. });
  12.  

De momento tengo esto, pero no entiendo ya que va bien hasta los primeros 5 números pero después aunque ponga guión medio no me lo toma y me lo quita.


Título: Re: [Pregunta]: Expresión regular para formato serial "12345-ABCDE-12345"
Publicado por: MCKSys Argentina en 13 Junio 2022, 19:41 pm
Hola!

No sé mucho de programación web, pero creo que en la 1era instrucción, estás pisando el valor del textbox (le estás asignando un valor).

Si es así, quizás deberías guardar el valor del textbox en una variable e ir reemplazando en la misma para finalmente asignarle al textbox.

Saludos!


Título: Re: [Pregunta]: Expresión regular para formato serial "12345-ABCDE-12345"
Publicado por: MinusFour en 13 Junio 2022, 20:36 pm
Porque estás remplazando la cadena de texto en cada instrucción. Solo la primera instrucción toma los primeros 5 caracteres y aplica el patrón de remplazo. Ese valor se guarda en la misma variable que utilizas para hacer validación. Obviamente en las siguientes instrucciones no existen los caracteres después del índice 5...


Título: Re: [Pregunta]: Expresión regular para formato serial "12345-ABCDE-12345"
Publicado por: l337* en 24 Junio 2022, 04:35 am
por qué no lo haces más simple?

Código:
const input = document.getElementById('giftcard-input');

const validKeys = /[a-z0-9\-]/i;
const validLetters = /[a-z]/i;

input.onkeydown = (e) => {
  const char = e.key;
  const currentStr = input.value;
  const currentStrLen = currentStr.length;

  // agrega teclas especiales como backspace o flecha derecha/izq
  if (char === "Backspace") {
    return true;
  }
  
  if (validKeys.test(char)) {
    // ya tenemos 10 digitos, 2 guiones, 5 letras
    if (currentStrLen === 17) {
      return false;
    }

    // debe ser numero
    if (currentStrLen < 5 || currentStrLen > 11) {
      return !isNaN(char);

    // debe ser guion
    } else if (currentStrLen === 5 || currentStrLen === 11) {
      return char === "-";

    // debe ser letra
    } else {
      return validLetters.test(char);
    }
  }

  // no es ningun char valido, no lo aceptamos en el input
  return false;
}


tambien podrias hacerlo por partes como -4 sugerio arriba, tomas los primeros 5, validas, luego los siguientes 5, etc.

otra es tener 3 inputs diferentes y solo validar si es letra o digito, podrias usar el attributo pattern y required en el input para que el navegador lo valide solo.

no hay necesidad de complicarse con tanto regex ni tratar de solucionar para cualquier caso inexistente.