为啥我的javascript regex.test() 会给出交替结果[重复]

Posted

技术标签:

【中文标题】为啥我的javascript regex.test() 会给出交替结果[重复]【英文标题】:why does my javascript regex.test() give alternating results [duplicate]为什么我的javascript regex.test() 会给出交替结果[重复] 【发布时间】:2011-02-20 12:47:59 【问题描述】:

可能重复:javascript regex returning true.. then false.. then true.. etc

var r = /\d/g;
var a = r.test("1"); // will be true
var b = r.test("1"); // will be false
console.log(a == b); // will be false

请向我解释为什么r.test("1") 的结果会随着每次调用而交替出现?

我能够通过删除 g 修饰符来解决我遇到的问题。但是我仍然想了解为什么会发生这种情况。

【问题讨论】:

【参考方案1】:

当您使用/g 时,正则表达式对象将保存调用之间的状态(因为您应该使用它来匹配多个调用)。它匹配一次,但后续调用从原始匹配之后开始。

(这是Javascript regex returning true.. then false.. then true.. etc的副本)

【讨论】:

谢谢!我发现了一些进一步的细节,说明 .test 基本上是 .exec() != null 的简写,它是 .exec() 存储下一次调用的 lastIndex。 (regular-expressions.info/javascript.html) 奇怪的是,即使给每个调用不同的字符串,也会发生同样的情况。如果在不同的字符串上调用 lastIndex 是否不会重置? 不,因为lastIndex 是正则表达式的属性,而不是字符串。相比之下,在 Perl 中,它与字符串(pos 属性)相关联,而在 Java 中,它由 Matcher 对象维护。 lastIndex 是很多挫败感的来源:blog.stevenlevithan.com/archives/fixing-javascript-regexp 浪费我的生命去调试这个奇怪的东西...... 我花了 2 天时间调试一个基于 /../g 正则表达式随机缓存资产的服务工作者。现在解释了原因。

以上是关于为啥我的javascript regex.test() 会给出交替结果[重复]的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的 JavaScript 没有提升函数?

为啥我的 Javascript 代码返回对象对象?

我的 Javascript 文件自动使用另一个,为啥?

为啥我的 javascript 一直引用相同的 innerHTML?

为啥我的 PATCH 请求的响应是空的? (Javascript)

为啥我的 JavaScript 函数显然没有被调用?