【JavaScript】正規表現にgオプションを指定して複数回実行する場合の注意点

スポンサーリンク

概要

JavaScriptの正規表現オブジェクトのtestメソッドをgオプションを指定して実行した場合、正規表現オブジェクト内に次の開始位置が保持される。
(lastIndexプロパティ)

そのため、同じ正規表現オブジェクトを複数回使い回すと、2回目以降は開始位置が先頭ではなくlastIndexの位置からとなる。

よって、同じ文字列に対して同じ正規表現オブジェクトのtestメソッドを実行しても、1回目と2回目で結果が異なる可能性がある。

const regex = /^123$/g;
console.log(regex.test('123')); // true
console.log(regex.test('123')); // false

以下のように、gオプションを指定しない、または毎回正規表現オブジェクトを生成すれば、実行結果は同じものとなる。

const regex = /^123$/;
console.log(regex.test('123')); // true
console.log(regex.test('123')); // true

console.log(/^123$/g.test('123')); // true
console.log(/^123$/g.test('123')); // true

参考サイト

defined regex in outer scope make different result in javascript?
I make an example here: var reg = /\s+/g; function testfn() { // reg = /\s+/g; var res = reg.test('mike ross'); var showEle = document.querySelector("#show"); showEle.inn...

コメント