RegEx para extraer todas las coincidencias de la cadena usando RegExp.exec

Resuelto gatlin asked hace 13 años • 19 respuestas

Estoy intentando analizar el siguiente tipo de cadena:

[key:"val" key2:"val2"]

donde hay pares clave arbitrarios: "val" en el interior. Quiero obtener el nombre de la clave y el valor. Para aquellos curiosos, estoy intentando analizar el formato de base de datos de Task Warrior.

Aquí está mi cadena de prueba:

[description:"aoeu" uuid:"123sth"]

lo que pretende resaltar que cualquier cosa puede estar en una clave o valor aparte del espacio, no hay espacios alrededor de los dos puntos y los valores siempre están entre comillas dobles.

En nodo, este es mi resultado:

[deuteronomy][gatlin][~]$ node
> var re = /^\[(?:(.+?):"(.+?)"\s*)+\]$/g
> re.exec('[description:"aoeu" uuid:"123sth"]');
[ '[description:"aoeu" uuid:"123sth"]',
  'uuid',
  '123sth',
  index: 0,
  input: '[description:"aoeu" uuid:"123sth"]' ]

Pero description:"aoeu"también coincide con este patrón. ¿Cómo puedo recuperar todas las coincidencias?

gatlin avatar Jun 13 '11 00:06 gatlin
Aceptado

Continúe llamando re.exec(s)en bucle para obtener todas las coincidencias:

var re = /\s*([^[:]+):\"([^"]+)"/g;
var s = '[description:"aoeu" uuid:"123sth"]';
var m;

do {
    m = re.exec(s);
    if (m) {
        console.log(m[1], m[2]);
    }
} while (m);

Pruébelo con este JSFiddle: https://jsfiddle.net/7yS2V/

lawnsea avatar Jun 12 '2011 18:06 lawnsea

str.match(pattern), si patterntiene la bandera global g, devolverá todas las coincidencias como una matriz.

Por ejemplo:

const str = 'All of us except @Emran, @Raju and @Noman were there';
console.log(
  str.match(/@\w*/g)
);
// Will log ["@Emran", "@Raju", "@Noman"]
Expandir fragmento

Anis avatar Apr 25 '2017 22:04 Anis

Para recorrer todas las coincidencias, puede utilizar la replacefunción:

var re = /\s*([^[:]+):\"([^"]+)"/g;
var s = '[description:"aoeu" uuid:"123sth"]';

s.replace(re, function(match, g1, g2) { console.log(g1, g2); });
Christophe avatar Jul 12 '2012 01:07 Christophe