2010-11-17 30 views
1

我在VS2005中开发,并在我的页面中有一些JS代码。在我遇到问题的特定循环中,我设置了一个断点。这是我与IDE的小谈话 -不寻常的JavaScript正则表达式结果,请解释!

? 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是我的正则表达式 - 我把它像这样:

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

UPDATE

所以我改变我的声明解决了我的问题

ind = /d/; 

即省略了全球改性剂。我想

ind = RegExp("d"); 

会同样工作。

虽然这个问题仍然存在。为什么全局修饰符会导致test在true和false之间切换?

回答

5

与EXEC(或与 其组合),测试呼吁 相同的全局正则表达式 例如多次将推动过去 以前的比赛。

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

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

ind.test("d") 

这将在位置0找到d。

ind.test("d") 

这将立即搜索d开始位置1,但因为这是字符串的结束也不会发现什么因此返回

我们可以使用正则表达式的lastIndex财产证明:

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

+1我只是写这个时,我发现别人已经回答:) – 2010-11-17 09:46:18

3

调用re.test(str)相当于re.exec(str) != null(见specification of RegExp.prototype.test(string))。

而且随着克对正则表达式调用exec修改多次,搜索是不是在开头的字符串,但在以前的搜索结束在那里的位置开始(lastIndex,与0初始化):

如果您的正则表达式使用“g”标志,则可以多次使用exec方法在同一个字符串中查找连续的匹配项。当您这样做时,搜索开始于由正则表达式的lastIndex属性指定的子字符串strtest也将提前lastIndex属性)。

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