2009-09-01 11 views
13

Tengo entendido que las tres líneas a continuación deben devolver un ARRAY con 2 resultados en él. Sin embargo, RegExp solo devolverá 1 resultado, sin importar cuántas veces se repita la expresión regular en la cadena.Javascript Regexp no devuelve resultados globales

¿Puede alguien explicar por qué? Y tal vez sugiera cómo puedo lograr que RegExp me dé resultados globales.

//INTPUT: 
    console.log(new RegExp("New York", "gi").exec("New York New York")); 

//OUTPUT: 
["New York"] 

//INTPUT: 
    console.log(new RegExp(/New York/gi).exec("New York New York")); 

//OUTPUT: 
["New York"] 

//INTPUT: 
    console.log("New York New York".match(/New York/gi)); 

//OUTPUT: 
["New York", "New York"] 
+0

ahora lo que realmente me intriga es que si se intenta '('Nueva York') .match (/ New York/gi) 'traerá solo 1 resultado (como se espera) y no puedo pensar en una mejor manera de evitar esto (cuando sea necesario) [que no sea iterar sobre él] (http: // stackoverflow. com/questions/42328875/javascript-regex-to-remove-all-numbers-with-specific-lenght-or-do-a-persistent)! :( – cregox

Respuesta

20

Su tercer ejemplo es la mejor manera de obtener la matriz de coincidencias.

RegExp.exec realidad recuerda su posición, y devuelve el siguiente resultado en llamadas posteriores:

>>> var v = /new york/gi 
>>> v.exec("NEW YORK new york") 
["NEW YORK"] 
>>> v.exec("NEW YORK new york") 
["new york"] 
>>> v.exec("NEW YORK new york") 
null 
+2

puede aprovechar esto para construir una aray usted mismo, pero es más fácil simplemente llamar a string.match –

+0

Tengo una serie de palabras clave que estoy tratando de obtener un recuento de la cantidad de ocurrencias en una cadena. ¿Cuál es la mejor forma de hacer eso? – StefanHayden

11

Esto es esperado, exec() devuelve una sola coincidencia pero proporciona más información sobre la coincidencia que match(). Si solo quieres todas las coincidencias, usa match(). De JavaScript: The Definitive Guide:

Recordemos que match() devuelve una matriz de coincidencias cuando se pasa una expresion regular de global. exec(), por contraste , siempre devuelve una sola coincidencia y proporciona información completa sobre esa coincidencia. Cuando se llama a exec() en una expresión regular que tiene el indicador g, establece la propiedad lastIndex de la subcadena concordada . Cuando se invoca a exec() una segunda vez para la misma expresión regular , comienza su búsqueda en la posición del carácter indicada por la propiedad lastIndex.

Cuestiones relacionadas