Aunque he usado expresiones regulares con bastante frecuencia, rara vez creo las mías propias. He estado leyendo sobre ellos recientemente porque necesito crear algunas expresiones bastante específicas para un proyecto en el que estoy trabajando.
Tengo un resumen muy específico sobre qué números de teléfono están permitidos en un formulario. Hay restricciones en los dos primeros o en los tres primeros números.
Los números deben comenzar con 06 o 07 , o alternativamente con 081 , 082 , 083 o 084 .
He escrito una expresión regular con una declaración condicional que creo que debería hacer una de dos cosas:
06 o 07 , verifique que los otros 8 caracteres de la cadena sean números.08 , verifique que el siguiente carácter esté entre 1 y 4 , luego verifique que los otros 7 caracteres sean números.Usé este tutorial para aprender cómo funcionan los condicionales en expresiones regulares. Aquí está la expresión que creé:
const validMobile = new RegExp(/^((0)?([6-7])[0-9]{8}|([8])[1-4][0-9]{7}) *$/);Lo que entiendo aquí es lo siguiente:
/^ (Empieza por)(0) (debe tener un cero primero)?([6*7]) (si el segundo carácter es seis o siete)[0-9]{8} (verifique que los siguientes ocho caracteres sean números entre cero y 9)|(8) (de lo contrario, si el segundo carácter es ocho)[1-4] (verifique que el tercer carácter sea un número entre uno y cuatro)[0-9]{7} (verifique que los siguientes siete caracteres sean números entre cero y nueve)Tenga en cuenta que la longitud de la cadena se está verificando en otro lugar, aunque creo que esta expresión también debería facilitar la verificación de que el número tiene exactamente 10 caracteres.
Esto no está dando el resultado esperado, así que debo estar malinterpretando algo. ¿Alguien podría ayudarme a entender dónde podría estar fallando?
El problema con su expresión regular son las dos alternativas (0)?([6-7])[0-9]{8} y ([8])[1-4][0-9]{7} . Tienes el cero inicial dentro del primero, por lo que un número como 0811234567 , que debe coincidir con el segundo, nunca coincidirá. Si mueve el cero de la primera alternativa al exterior, comienza a funcionar como pretendía:
^0(([6-7])[0-9]{8}|(8)[1-4][0-9]{7}) *$Compruébelo usted mismo en regex101 ...
Más comentarios sobre la expresión regular original:
? después del cero en realidad lo hace opcional, por eso lo eliminé.([6-7]) y ([8]) ), ¿realmente los necesita?[8] sin efecto -> 8 .(this|that) , donde la tubería funciona como un operador OR.? es un cuantificador, lo que significa que lo que vino antes es opcional (puede ocurrir 0 veces o una vez). Si pones eso detrás de tu cero, lo conviertes en lo opuesto a "debe estar ahí".Con ese conocimiento en mente y escribiendo la expresión regular en varias líneas e ignorando los espacios en blanco entre ellos, se trata de:
^0( [67][0-9]{8} | 8[1-4][0-9]{7} )$ También eliminé los espacios en blanco opcionales después de tu número de teléfono: en ninguna parte explicaste que querías tal cosa, ni estaba en tu lista. Tampoco tiene sentido permitir espacios solo después del número de teléfono pero no al frente. Así que la parte * tampoco es para divertirse.
También desaconsejo encarecidamente el uso de expresiones regulares en los números de teléfono: las personas tienden a ingresar números de teléfono sin espacios o guiones en el medio. Echa un vistazo a todas las Q existentes .