Javascript / NodeJS正则表达式评估在第3次尝试时失败

时间:2016-07-14 13:01:25

标签: javascript regex node.js

我正在尝试使用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设备。可能有什么不对

1 个答案:

答案 0 :(得分:1)

每当正则表达式具有/ g时,它的行为都不同。基本上每次找到匹配时它都会前进,下次使用时它会再次从存储在最后一个索引属性中的位置开始。见https://developer.mozilla.org/en/docs/Web/JavaScript/Guide/Regular_Expressions#Advanced_searching_with_flags

不确定是否有更好的在线参考。 David Flanagan的“Javascript:The Definitive Guide”有一篇很好的写作