Warum verursachen reguläre Ausdrücke für globale Flags eine falsche Ausgabe?
P粉282627613
2023-08-22 19:11:39
<p>Was ist an dieser Regex falsch, wenn ich globale Flags und Flags ohne Berücksichtigung der Groß- und Kleinschreibung verwende? Abfragen sind benutzergenerierte Eingaben. Das Ergebnis sollte [wahr, wahr] sein. </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'));
//Das Ergebnis ist [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>
您正在使用一个
RegExp
对象,并且多次执行它。在每次执行时,它都会从上次匹配的索引继续。在每次执行之前,您需要“重置”正则表达式以从头开始:
话虽如此,每次创建一个新的RegExp对象可能更易读(开销很小,因为RegExp已经被缓存):
使用带有
g
标志的RegExp
对象会跟踪匹配发生的lastIndex
,因此在后续的匹配中,它将从上次使用的索引开始,而不是从 0 开始。看一下示例: