validate test solo regulares regular probar numeros expresiones expresion example especiales espacio ejemplos caracteres blanco javascript regex

test - ¿Cómo recupero todas las coincidencias para una expresión regular en JavaScript?



probar expresiones regulares (12)

Aquí está mi función para obtener las coincidencias:

function getAllMatches(regex, text) { if (regex.constructor !== RegExp) { throw new Error(''not RegExp''); } var res = []; var match = null; if (regex.global) { while (match = regex.exec(text)) { res.push(match); } } else { if (match = regex.exec(text)) { res.push(match); } } return res; } var regex = /abc|def|ghi/g; var res = getAllMatches(regex, ''abcdefghi''); res.forEach(function (item) { console.log(item[0]); });

Soy nuevo en expresiones regulares. Estoy tratando de analizar el siguiente tipo de cadena:

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

donde hay una clave arbitraria: pares "val" dentro. Quiero tomar el nombre de la clave y el valor. Para los curiosos, estoy tratando de analizar el formato de la base de datos de task warrior. Aquí está mi cadena de prueba:

[description:"aoeu" uuid:"123sth"] 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 están siempre 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?


Aquí está mi respuesta:

var str = ''[me nombre es] : My name is. [Yo puedo] is the right word''; var reg = //[(.*?)/]/g; var a = str.match(reg); a = a.toString().replace(/[/[/]]/g, "").split('',''));


Basado en la función de Agus, pero prefiero devolver solo los valores de coincidencia:

var bob = "> bob <"; function matchAll(str, regex) { var res = []; var m; if (regex.global) { while (m = regex.exec(str)) { res.push(m[1]); } } else { if (m = regex.exec(str)) { res.push(m[1]); } } return res; } var Amatch = matchAll(bob, /(&.*?;)/g); console.log(Amatch); // yeilds: [>, <]


Continúe llamando a re.exec(s) en un 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ébalo con este jsfiddle: http://jsfiddle.net/7yS2V/


Definitivamente recomendaría usar la función String.match () y crear un RegEx relevante para ella. Mi ejemplo es con una lista de cadenas, que a menudo es necesaria al escanear las entradas de los usuarios para palabras clave y frases.

// 1) Define keywords var keywords = [''apple'', ''orange'', ''banana'']; // 2) Create regex, pass "i" for case-insensitive and "g" for global search regex = new RegExp("(" + keywords.join(''|'') + ")", "ig"); => /(apple|orange|banana)/gi // 3) Match it against any string to get all matches "Test string for ORANGE''s or apples were mentioned".match(regex); => ["ORANGE", "apple"]

¡Espero que esto ayude!


Esta es una solución

var s = ''[description:"aoeu" uuid:"123sth"]''; var re = //s*([^[:]+):/"([^"]+)"/g; var m; while (m = re.exec(s)) { console.log(m[1], m[2]); }

Esto se basa en la respuesta de lawnsea, pero más corto.

Observe que el indicador `g ''debe establecerse para mover el puntero interno hacia adelante a través de las invocaciones.


Iterables son más agradables:

const matches = (text, pattern) => ({ [Symbol.iterator]: function * () { const clone = new RegExp(pattern.source, pattern.flags); let match = null; do { match = clone.exec(text); if (m) { yield match; } } while (match); } });

Uso en un bucle:

for (const match of matches(''abcdefabcdef'', /ab/g)) { console.log(match); }

O si quieres una matriz:

[ ...matches(''abcdefabcdef'', /ab/g) ]


OMG No entiendo que desde 2011 nadie haya enviado la buena respuesta.

Supongamos que su cadena es como [tecla: "val" clave2: "val2"] como se solicitó anteriormente por y desea recuperar todas las coincidencias con una expresión regular: puede disfrutar del segundo parámetro de la función de reemplazo que puede ser un función de devolución de llamada ... y luego obtener todos los argumentos que ha encontrado su expresión regular. A continuación, un ejemplo que puedes jugar en tu consola:

var str = ''[foo:"bar" thud:"grunt" bazola:"ztesch"]''; var regex = new RegExp(''(//w+):"(//w+)"'', ''ig''); var table = []; str.replace(regex, function() { var matches = arguments; table.push(matches); }); console.log(table); //=> ["foo:"bar"", "foo", "bar", 1, .....


Para mí, una función final es esencial, así que preparé la respuesta de lawnsea en una función para copiar y pegar fácilmente.

function findall(regex_pattern, string_) { var output_list = []; while (true) { var a_match = regex_pattern.exec(string_); if (a_match) { // get rid of the string copy delete a_match.input; // store the match data output_list.push(a_match); } else { break; } } return output_list; }

uso de ejemplo:

console.log( findall(/blah/g,''blah1 blah2'') )

productos:

[ [ ''blah'', index: 0 ], [ ''blah'', index: 6 ] ]


Para recorrer todas las coincidencias, puede usar la función de replace :

var re = //s*([^[:]+):/"([^"]+)"/g; var s = ''[description:"aoeu" uuid:"123sth"]''; s.replace(re, function(match, g1, g2) { console.log(g1, g2); });


Utilizar esta...

var all_matches = your_string.match(re); console.log(all_matches)

Devolverá una matriz de todas las coincidencias ... Eso funcionaría bien ... Pero recuerde que no tomará en cuenta a los grupos ... Devolverá las coincidencias completas ...


str.match(pattern) devolverá todas las coincidencias como una matriz. Supongo que esta es la forma más fácil.

Por ejemplo -

"All of us except @Emran, @Raju and @Noman was there".match(/@/w*/g) // Will return ["@Emran", "@Raju", "@Noman"]