起
ちょっと正規表現の処理を書いてたらこんなことが起きた。
> var re = /^\d+$/g;
> var src = "1234";
> re.test(src);
true
> re.test(src);
false
> re.exec(src);
["1234"]
> re.exec(src);
null
な、なんと同じ正規表現に同じテキストソースを渡してやると異なる結果が返ってくる……
期待している動作と完全に違ったので脳内パニック。
承
ググってたらそれらしいものをみつけた。
参考:why does my javascript regex.test() give alternating results - Stack Overflow
どうやらグローバルオプション(g)をつけると、lastIndexにstateが保存されるので初回とは違う動作になるとか。。。
結
> var re = /^\d+$/;
> var src = "1234";
> re.test(src);
true
> re.test(src);
true
> re.exec(src);
["1234"]
> re.exec(src);
["1234"]
必要ない時はgフラグをつけないようにしよう。
追記
コメントで更に為になるページを戴きました。
JavaScriptで正規表現を複数回実行する際の注意点