为啥我的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 一直引用相同的 innerHTML?