我想在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設備。什麼可能是錯誤的
使用'var iOSRegex =/iPad | iPhone | iPod /;'(或者更好:'var iOSRegex =/iP(?:ad | hone | od )/;') –