我正在尝试使用NodeJS中的正则表达式进行一些模式匹配,并且遇到了一个奇怪的问题。对于相同模式的第三次调用以及用于匹配模式的相同字符串,模式匹配失败。以下是我正在尝试的代码段。
$(document).on('click', "div.your-class", function() {
$("#" + lastFormElementFocused).focus();
var element = $(document.activeElement);
// Do with 'element' what you want
});
如您所见,第6行的第三次检查失败。我在Chrome和Safari浏览器控制台上对此进行了测试,结果完全相同。
有趣的是,当我们在其他3次之后调用测试1并且第三次调用总是失败时,这会失败。下面给出的代码证明了这种行为。
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
但我有一个NodeJS应用程序,我已将上面的正则表达式定义为常量。由于这种行为,来自iPhone的每三个请求都将其评估为false,因此无法将其检测为iOS设备。可能有什么不对
答案 0 :(得分:1)
每当正则表达式具有/ g时,它的行为都不同。基本上每次找到匹配时它都会前进,下次使用时它会再次从存储在最后一个索引属性中的位置开始。见https://developer.mozilla.org/en/docs/Web/JavaScript/Guide/Regular_Expressions#Advanced_searching_with_flags
不确定是否有更好的在线参考。 David Flanagan的“Javascript:The Definitive Guide”有一篇很好的写作