NodeJSで正規表現を使用していくつかのパターンマッチングを行い、奇妙な問題が発生しました。同じパターンの3回目の呼び出しとパターン一致に使用された同じ文字列のパターンマッチングは失敗します。以下は私が試しているコードスニペットです。Javascript/NodeJS正規表現3回目の試行で評価が失敗する
var iOSRegex = /iPad|iPhone|iPod/g;
var ua = "Mozilla/5.0 (iPhone; CPU iPhone OS 9_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13B137 Safari/601.1";
var first = iOSRegex.test(ua);
var second = iOSRegex.test(ua);
var third = iOSRegex.test(ua); // This evaluates to false.
console.log(first + ' -- ' + second + ' -- ' + third);
//Result true -- true -- false
3行目の3番目のチェックが失敗することがわかります。 ChromeとSafariのブラウザコンソールでこれをテストしたところ、全く同じ結果が得られました。
興味深いのは、テスト1を他の3回後に呼び出すと失敗し、3回目の呼び出しが常に失敗するという点です。以下のコードはこの動作を証明しています。
var iOSRegex = /iPad|iPhone|iPod/g;
var ua = "Mozilla/5.0 (iPhone; CPU iPhone OS 9_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13B137 Safari/601.1";
var first = iOSRegex.test(ua);
console.log(ua.match(iOSRegex));
var second = iOSRegex.test(ua);
var third = iOSRegex.test(ua);
var fourth = iOSRegex.test(ua); // This evaluates to false.
console.log(first + ' -- ' + second + ' -- ' + third + ' -- ' + fourth);
/*
Result
[ 'iPhone', 'iPhone' ]
true -- true -- true -- false
*/
しかし、私はNodeJSアプリケーションを持っており、上記の正規表現を定数として定義しています。この動作により、iPhoneからの3回目のリクエストごとにこれがfalseに評価され、iOSデバイスとして検出されません。何が間違っている可能性がありますか?
「var iOSRegex =/iPad | iPhone | iPod /;」(またはそれ以上のものを使用してください:var iOSRegex =/iP(?:ad | hone | od )/; ') –