グローバル フラグの正規表現によって誤った出力が発生するのはなぜですか?
P粉282627613
2023-08-22 19:11:39
<p>グローバル フラグと大文字小文字を区別しないフラグを使用すると、この正規表現の何が問題になりますか?クエリはユーザーが生成した入力です。結果は [true, true] になるはずです。 </p>
<pre class="brush:php;toolbar:false;">var query = 'Foo B';
var re = 新しい RegExp(クエリ, 'gi');
var 結果 = [];
result.push(re.test('Foo Bar'));
result.push(re.test('Foo Bar'));
//結果は [true, false]</pre> となります。
<時間>
<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 からではなく、最後に使用したインデックスから開始します。例を見てみましょう: