Why do regular expressions for global flags cause incorrect output?
P粉282627613
2023-08-22 19:11:39
<p>What is wrong with this regex when I use global flags and case insensitive flags? Queries are user-generated input. The result should be [true, true]. </p>
<pre class="brush:php;toolbar:false;">var query = 'Foo B';
var re = new RegExp(query, 'gi');
var result = [];
result.push(re.test('Foo Bar'));
result.push(re.test('Foo Bar'));
//The result will be [true, false]</pre>
<hr>
<p>
<pre class="snippet-code-js lang-js prettyprint-override"><code>var reg = /^a$/g;
for(i = 0; i < 10;)
console.log(reg.test("a"));</code></pre>
</p>
You are using a
RegExp
object and executing it multiple times. On each execution, it continues from the last matching index.Before each execution, you need to "reset" the regex to start from scratch:
Having said that, it might be more readable to create a new RegExp object each time (the overhead is minimal since the RegExp is already cached):
Using a
RegExp
object with theg
flag will keep track of thelastIndex
where the match occurred, so on subsequent matches it will Start from the last used index, not from 0. Take a look at the example: