Soy nuevo en expresiones regulares. Traté de encontrar una respuesta para mi caso, pero fracasé estrepitosamente. Probé muchas ideas que encontré pero no funcionó para mí.

Tengo un patrón repetitivo especial que traté de hacer coincidir, e hice la mayor parte porque no puedo encontrar la solución exacta. Esto es lo que hice:

Mi expresión regular

/((([a-zA-IK-Z][a]?)[\d]{1,3}[a-zA-Z]?)(-)?){1,}/g

Mi patrón:

Aa200-B300-M52A-G5-Aa50   match (expected)
Aa200-B300-M52A-G5-A      doesn't match (expected)
Aa200-B300-M52A-G5-Aa     doesn't match (expected)

Y para estos casos funciona muy bien, pero quiero que no coincida con el siguiente ejemplo:

Aa200-B300-M52A-     (ending with -)

¿Cuál es la forma correcta de lograr esto?

1
Boris J. 16 oct. 2018 a las 14:01

2 respuestas

La mejor respuesta

Puede utilizar este patrón:

/^[a-zA-IK-Z]a?\d{1,3}[a-zA-Z]?(?:-[a-zA-IK-Z]a?\d{1,3}[a-zA-Z]?)*$/gm

Demo de RegEx

Al colocar - al comienzo del grupo repetido sin captura, nos aseguramos de que - ocurra solo en el medio pero no al final.

2
anubhava 16 oct. 2018 a las 11:11

Puedes probar esto. Define que si hay un grupo siguiente, debe haber un "-" antes. También cambié sus grupos de números de {1,3} a {0,3} ya que sus coincidencias esperadas no siempre tienen un número en ellos (segundo y tercer caso). ¡Espero que esto ayude!

const regex = /^([a-zA-IK-Z]a?[\d]{0,3}[a-zA-Z]?)(-([a-zA-IK-Z]a?[\d]{0,3}[a-zA-Z]?))*$/;

console.log("Should match");
console.log("Aa200-B300-M52A-G5-Aa50".match(regex));
console.log("Aa200-B300-M52A-G5-A".match(regex));
console.log("Aa200-B300-M52A-G5-Aa".match(regex));

console.log("Should not match");
console.log("Aa200-B300-M52A-G5-".match(regex));
0
Alex G 16 oct. 2018 a las 11:31