2016-07-14 15 views
0

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デバイスとして検出されません。何が間違っている可能性がありますか?

+1

「var iOSRegex =/iPad | iPhone | iPod /;」(またはそれ以上のものを使用してください:var iOSRegex =/iP(?:ad | hone | od )/; ') –

答えて

1

正規表現に/ gがあるときはいつも、それは異なって動作します。基本的に一致するものが見つかるたびに、それは前進し、次に使用されるときには最後のindexプロパティに格納された位置から再び開始されます。 https://developer.mozilla.org/en/docs/Web/JavaScript/Guide/Regular_Expressions#Advanced_searching_with_flags

オンラインで参照できるかどうかわかりません。デビッド・フラナガンの「Javascript:The Definitive Guide」は優れた書き込みを持っています

関連する問題