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"]
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
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With