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 … …
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
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
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.match
— desarrollador.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.match
mientrasRegExp.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
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
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
¿Alguien puede sugerir una forma de bucle for para hacerlo?
– DNB5brims
3 de agosto de 2009 a las 12:34