2016-07-14 92 views
0

我想在NodeJS中使用正則表達式進行一些模式匹配,並且遇到了一個奇怪的問題。對於相同模式的第三次調用以及用於匹配模式的相同字符串,模式匹配失敗。下面是我正在嘗試的代碼片段。Javascript/NodeJS正則表達式第三次嘗試評估失敗

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 

正如你可以看到第6行的第三個檢查失敗。我在Chrome和Safari瀏覽器控制檯上進行了測試,結果完全相同。

有趣的部分是,當我們連續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的每第三次請求都會將其評估爲false,因此無法將其檢測爲iOS設備。什麼可能是錯誤的

+1

使用'var iOSRegex =/iPad | iPhone | iPod /;'(或者更好:'var iOSRegex =/iP(?:ad | hone | od )/;') –

回答