2016-07-14 56 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 )/;') –

回答