The RegExp
object keeps track of the lastIndex
where a match occurred, so on subsequent matches it will start from the last used index, instead of 0. Take a look:
var query = 'Foo B';
var re = new RegExp(query, 'gi');
var result = [];
result.push(re.test('Foo Bar'));
alert(re.lastIndex);
result.push(re.test('Foo Bar'));
As far as I know, only Firefox 3+, allows you to specify the sticky
flag (y
), which will reset the counter after every match. Alternatively, you could manually reset it.
Here's the algorithm that the specs dictate (section 15.10.6.2):
RegExp.prototype.exec(string)
Performs
a regular expression match of string
against the regular expression and
returns an Array object containing the
results of the match, or null if the
string did not match The string
ToString(string) is searched for an
occurrence of the regular expression
pattern as follows:
- Let S be the value of ToString(string).
- Let length be the length of S.
- Let lastIndex be the value of the lastIndex property.
- Let i be the value of ToInteger(lastIndex).
- If the global property is false, let i = 0.
- If I < 0 or I > length then set lastIndex to 0 and return null.
- Call [[Match]], giving it the arguments S and i. If [[Match]]
returned failure, go to step 8;
otherwise let r be its State result
and go to step 10.
- Let i = i+1.
- Go to step 6.
- Let e be r's endIndex value.
- If the global property is true, set lastIndex to e.
- Let n be the length of r's captures array. (This is the same
value as 15.10.2.1's
NCapturingParens.)
- Return a new array with the following properties:
- The index
property is set to the position of the
matched substring within the complete
string S.
- The input property is set
to S.
- The length property is set to
n + 1.
- The 0 property is set to the
matched substring (i.e. the portion of
S between offset i inclusive and
offset e exclusive).
- For each
integer i such that I > 0 and I ≤ n,
set the property named ToString(i) to
the ith element of r's captures array.