Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Javascript Regexp not returning global results

It's my understanding that all three of these lines below should return an ARRAY with 2 results in it. Yet RegExp will only return 1 result no matter how many times the regex repeats in the string.

Can some one explain why? And perhaps suggest how I can get RegExp to give me global results?

//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"]
like image 225
StefanHayden Avatar asked Sep 01 '09 14:09

StefanHayden


2 Answers

your third example is the best way to get the array of matches.

RegExp.exec actually remembers its position, and returns the next result on subsequent calls:

>>> 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
like image 166
Rob Fonseca-Ensor Avatar answered Sep 30 '22 02:09

Rob Fonseca-Ensor


This is expected, exec() returns a single match but provides more info about the match than match(). If you just want all the matches, use match(). From JavaScript: The Definitive Guide:

Recall that match() returns an array of matches when passed a global regular expresion. exec(), by contrast, always returns a single match and provides complete information about that match. When exec() is called on a regular epression that has the g flag, it sets the lastIndex property of the matched substring. When exec() is invoked a second time for the same regular expression, it begins its search at the character position indicated by the lastIndex property.

like image 33
Derek Swingley Avatar answered Sep 30 '22 02:09

Derek Swingley