【问题标题】: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 修饰符来解决我遇到的问题。但是我仍然想了解为什么会发生这种情况。

【问题讨论】:

    标签: javascript regex


    【解决方案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 正则表达式随机缓存资产的服务工作者。现在解释了原因。
    猜你喜欢
    • 2015-11-16
    • 1970-01-01
    • 2012-02-07
    • 1970-01-01
    • 1970-01-01
    • 2013-10-01
    • 2012-06-09
    • 1970-01-01
    • 2012-10-27
    相关资源
    最近更新 更多