不寻常的javascript正则表达式结果,请说明!

时间:2010-11-17 09:13:11

标签: javascript regex

我正在VS2005中开发并在我的页面中有一些JS代码。我在一个特定的循环中设置了一个断点,我遇到了一个问题。这是我与IDE的小谈话 -

? ind
/d/g
? ind.test("d")
true
? ind.test("dtn")
false
? ind.test("dtn")
true
? ind.test("dtn")
false
? ind.test("dtn")
true
? ind.test("dtn")
false

为什么测试在真与假之间交替? ind是我的RegEx - 我这样设置:

case "datetime" : ind = new RegExp("d","g");break;

更新

所以我通过将声明改为

解决了我的问题
ind = /d/;

即省略全局修饰符。我想那个

ind = RegExp("d");

同样也可以。

问题仍然存在。为什么全局修饰符导致test在true和false之间交替?

2 个答案:

答案 0 :(得分:5)

  

与exec一样(或与exec结合使用)   它),测试多次调用   相同的全局正则表达式   实例将超越   上一场比赛。

来源:https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/RegExp/test

所以这里究竟发生了什么,因为你正在使用正则表达式的全局选项,它会在找到匹配后继续搜索字符串。

ind.test("d")

这将在位置0 找到d。

ind.test("d")

现在将从位置1 开始搜索d,但由于这是字符串的结尾,因此无法找到任何内容,因此返回 false

我们可以使用正则表达式的lastIndex属性来证明:

ind.lastIndex
>> 0
ind.test("d")
>> true
ind.lastIndex
>> 1
ind.test("d")
>> false

答案 1 :(得分:3)

致电re.test(str)相当于re.exec(str) != null(请参阅specification of RegExp.prototype.test(string))。

在重复使用 g 修饰符对正则表达式调用exec时,搜索不会在字符串的开头处开始,而是在上一次搜索结束的位置开始({ {1}},已初始化为lastIndex):

  

如果正则表达式使用“0”标志,则可以多次使用g方法在同一字符串中查找连续匹配项。执行此操作时,搜索从正则表达式的exec属性指定的str子字符串开始(lastIndex也将提升test属性。)

这就是为什么你得到这个奇怪的结果。