¿Cómo hacer un bucle de todos los elementos que coinciden con la expresión regular?

5 minutos de lectura

Este es el caso: quiero encontrar los elementos que coincidan con la expresión regular…

targetText = “AlgunosT1extAlgunosT2extAlgunosT3extAlgunosT4extAlgunosT5extAlgunosT6ext”

y uso la expresión regular en javascript como este

reg = new RegExp(/e(.*?)e/g);   
var result = reg.exec(targetText);

y solo obtengo el primero, pero no el siguiente… Solo puedo obtener el T1, pero no T2, T3 … …

  • ¿Alguien puede sugerir una forma de bucle for para hacerlo?

    – DNB5brims

    3 de agosto de 2009 a las 12:34

avatar de usuario de caos
caos

var reg = /e(.*?)e/g;
var result;
while((result = reg.exec(targetText)) !== null) {
    doSomethingWith(result);
}

  • En lugar de usar RegExp nuevo y luego conectar un regexp, simplemente haz reg = /e(.*>)e/g; Usar el operador new es redundante a menos que lo estés alimentando con una cadena. También asegúrese de marcar esto con la bandera global (/g) o puede terminar en un bucle infinito.

    – Frug

    10/04/2014 a las 21:07

  • Tenga en cuenta que la expresión regular debe asignarse a un objeto antes de usar de esta manera: /e(.*?)e/.exec(...) dará un bucle infinito.

    – BRAZO

    24 mayo 2017 a las 18:36

  • @RaviParekh: ¿agregaste el /g modificador?

    – caos

    30 de noviembre de 2017 a las 15:26

  • Por el bien de la posteridad, RegExp debe declararse fuera del ciclo while; de lo contrario, aún obtendrá un bucle infinito.

    – Modulares

    13 de marzo de 2018 a las 16:04

  • También puede acortar la expresión while: while(result = reg.exec(targetText)) { aprovechando la resolución “falsa”.

    – Modulares

    13 de marzo de 2018 a las 16:10

Avatar de usuario de Modular
Modular

Tres enfoques dependiendo de lo que quieras hacer con él:

  • Recorre cada partido: .match

    targetText.match(/e(.*?)e/g).forEach((element) => {
       // Do something with each element
    });
    
  • Recorra y reemplace cada coincidencia sobre la marcha: .replace

    const newTargetText = targetText.replace(/e(.*?)e/g, (match, $1) => {
      // Return the replacement leveraging the parameters.
    });
    
  • Recorre y haz algo sobre la marcha: .exec

    const regex = /e(.*?)e/g;  // Must be declared outside the while expression, 
                               // and must include the global "g" flag.
    
    let result;
    while(result = regex.exec(targetText)) {
      // Do something with result[0].
    } 
    

  • Irónicamente, mi pelusa quiere poner == en lugar de = en la expresión while.

    – Gherman

    8 de noviembre de 2019 a las 15:36

  • Para hacer que eslint acepte el single = la tarea puede estar entre paréntesis así: while ((result = regex.exec(targetText)))

    – Shean

    14 de noviembre de 2019 a las 9:22


  • En el segundo ejemplo, ¿coincidir es una palabra clave o una variable? Y si es una variable, ¿qué contiene?

    – Cole Perry

    22 de enero de 2020 a las 21:26

  • @ColePerry match es toda la coincidencia RegExp, y $1 es el primer grupo de captura ()en ese ejemplo, solo uno.

    – Modulares

    31 de enero de 2020 a las 22:09

  • Aquí, solo funcionará reemplazar, porque en Node.js la coincidencia/ejecutivo global devuelve solo la coincidencia total sin grupos.

    – Mirik

    31 de agosto de 2020 a las 16:14

avatar de usuario de tvanfosson
tvanfosson

Intenta usar fósforo() en la cadena en lugar de exec(), aunque también podría hacer un bucle con exec. Match debería darte todos los partidos de una sola vez. Creo que también puedes omitir el especificador global.

reg = new RegExp(/e(.*?)e/);   
var matches = targetText.match(reg);

  • No enlace a w3schools. No están afiliados al W3C y tienen mucha información incorrecta. Ver w3fools.com.

    – dbkaplun

    24 de junio de 2012 a las 5:21


  • @MindVirus: si se molesta en verificar, han limpiado muchas de las cosas que señaló w3fools.com. Todavía los uso como un recurso rápido, aunque no definitivo. Al igual que uno podría usar una hoja de trucos sobre K&R C para buscar algo simple.

    – tvanfosson

    24 de junio de 2012 a las 13:34

  • Como desarrollador intermedio, ya he encontrado media docena de errores claros en w3schools. Están fuera de mi lista de fiestas.

    –Mark McKenna

    18 de julio de 2013 a las 0:17

  • Referencia MDN para String.prototype.matchdesarrollador.mozilla.org/en/docs/Web/JavaScript/Reference/…

    – Lee Godard

    7 de diciembre de 2015 a las 9:56

  • la diferencia es que no obtienes los grupos capturados con String.matchmientras RegExp.exec hace.

    – Vitim.es

    23 mayo 2018 a las 19:11


Seguí recibiendo bucles infinitos mientras seguía los consejos anteriores, por ejemplo:

var reg = /e(.*?)e/g;
var result;
while((result = reg.exec(targetText)) !== null) {
    doSomethingWith(result);
}

El objeto que se le asignó result cada vez fue:

["", "", index: 50, input: "target text", groups: undefined]

Entonces, en mi caso, edité el código anterior para:

const reg = /e(.*?)e/g;
let result = reg.exec(targetText);
while(result[0] !== "") {
    doSomethingWith(result);
    result = reg.exec(targetText);
}

targetText = "SomeT1extSomeT2extSomeT3extSomeT4extSomeT5extSomeT6ext"    
reg = new RegExp(/e(.*?)e/g);   
var result;
while (result = reg.exec(targetText))
{
    ...
}

  • no funciona En JS regex no se pueden extraer grupos con bandera global, por lo que el usuario recibirá solo la coincidencia total.

    – Mirik

    31 de agosto de 2020 a las 16:11

Avatar de usuario de Christopher
Cristóbal

También puede usar el método String.replace para recorrer todos los elementos.

result = [];
 // Just get all numbers
"SomeT1extSomeT2extSomeT3ext".replace(/(\d+?)/g, function(wholeMatch, num) {
  // act here or after the loop...
  console.log(result.push(num));
  return wholeMatch;
});
console.log(result); // ['1', '2', '3']

Saludos

  • no funciona En JS regex no se pueden extraer grupos con bandera global, por lo que el usuario recibirá solo la coincidencia total.

    – Mirik

    31 de agosto de 2020 a las 16:11

avatar de usuario de ncmathsadist
ncmathsadist

Hice esto en una sesión de consola (Chrome).

> let reg = /[aeiou]/g;
undefined
> let text = "autoeciously";
undefined
> matches = text.matches(reg);
(7) ["a", "u", "o", "e", "i", "o", "u"]
> matches.forEach(x =>console.log(x));
a
u
o
e
i
o
u

¿Ha sido útil esta solución?