gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 06:32:49 26 4
gpt4 key购买 nike

我试图在 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 设备。可能出了什么问题

最佳答案

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

不确定是否有更好的在线引用。 David Flanagan 的《Javascript:权威指南》写得非常好

关于Javascript/NodeJS 正则表达式评估在第三次尝试时失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38374975/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com