RegEx para extraer todas las coincidencias de la cadena usando RegExp.exec
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?
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/
str.match(pattern)
, si pattern
tiene 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"]
Para recorrer todas las coincidencias, puede utilizar la replace
función:
var re = /\s*([^[:]+):\"([^"]+)"/g;
var s = '[description:"aoeu" uuid:"123sth"]';
s.replace(re, function(match, g1, g2) { console.log(g1, g2); });