Estoy tratando de escribir una expresión regular que devolverá true si coincide con el formato siguiente, de lo contrario, debería devolver false. Solo debe permitir palabras como las siguientes:

Coincidencia positiva (devolver verdadero)

UA-1234-1,UA-12345-2,UA-34578-2

Coincidencia negativa (devuelve falso o nulo)

Nota: A falta después de U

UA-1234-1,U-12345-2

Siempre debería darme verdadero cuando la cadena pasada a regex es UA-1234-1,UA-12345-2,UA-34578-2,...........

A continuación se muestra lo que estoy tratando de hacer, pero solo coincide con el primer elemento y no devuelve nulo.

var pattern=/^UA-[0-9]+(-[0-9]+)?/g;

pattern.match("UA-1234-1,UA-12345-2,UA-34578-2");

pattern.exec("UA-1234-1,UA-12345-2,UA-34578-2)

Gracias por adelantado. Se agradece enormemente la ayuda.

0
Mallu Golageri 13 nov. 2017 a las 18:38

2 respuestas

La mejor respuesta

El patrón que necesita es un patrón encerrado con anclas (^ - comienzo de la cadena y $ - final de la cadena) que coincide con su patrón al principio (el "bloque" inicial) y luego coincide con 0 o más apariciones de un , seguido del patrón de bloque.

Parece /^BLOCK(?:,BLOCK)*$/. Puede introducir espacios en blanco opcionales en el medio, p. Ej. /^BLOCK(?:,\s*BLOCK)*$/.

Al final, el patrón se parece a ^UA-[0-9]+(?:-[0-9]+)?(?:,UA-[0-9]+(?:-[0-9]+)?)*$. Es mejor construirlo dinámicamente para que sea legible y fácil de mantener:

const block = "UA-[0-9]+(?:-[0-9]+)?";
let rx = new RegExp(`^${block}(?:,${block})*$`); // RegExp("^" + block + "(?:," + block + ")*$") // for non-ES6
let tests = ['UA-1234-1,UA-12345-2,UA-34578-2', 'UA-1234-1,U-12345-2'];
for (var s of tests) {
  console.log(s, "=>", rx.test(s));
}
0
Wiktor Stribiżew 14 nov. 2017 a las 10:37

Divida la cadena por comas y pruebe cada elemento en su lugar.

-2
Calvin Taylor 13 nov. 2017 a las 15:45