【问题标题】:what is the reason for the result in javascript ?javascript中结果的原因是什么?
【发布时间】:2014-01-04 02:38:15
【问题描述】:
var re1=new RegExp("","g");
var str1="a";
console.log(str1.match(re1));

var re2=new RegExp("","g");
var str2="a";
console.log(re2.exec(str2));
console.log(re2.exec(str2));

为什么第一个会捕获两个空字符串,而第二个只能包含一个空字符串?

【问题讨论】:

  • @Vache: match 将返回所有结果,但 exec 只会返回一个。我认为您的编辑使问题无效。
  • @icktoofay 是的,我完全误解了问题的含义。对此感到抱歉。
  • @Daniel:不完全是。您通常应该能够用exec 循环替换对match 的调用;然而,在这种情况下,它们会产生不同的结果,这就是问题所在。

标签: javascript regex


【解决方案1】:

简而言之:它没有。

js> var re1 = new RegExp("", "g");
js> var str1 = "a";
js> str1.match(re1)
["", ""]
js> var re2 = new RegExp("", "g");
js> var str2 = "a";
js> re2.exec(str2)
[""]
js> re2.exec(str2)
[""]

每个[""]s 都是一个结果,因为exec 意味着在循环中调用并检索所有匹配所有组,如:

var pairs = /(.).*?\1/g;
var input = "._.  ^.^ -__-";
var match;

while (match = pairs.exec(input)) { // exec() returns null on /g regexes when there are no more matches
    console.log(match);
}

一个更有趣的问题可能是为什么re2.lastIndex在匹配后不会改变,所以你可以永远得到相同的匹配,它永远不会是null。好吧,那只是因为它在每次匹配时都会增加匹配的长度,而这里的长度为零。

【讨论】:

  • 你可以继续运行 re2.exec(str2) 并且会得到相同的结果,但是 re2.lastIndex 的结果从未改变,为什么? var re2=new RegExp("","g"); var str2="a"; console.log(re2.exec(str2),re2.lastIndex); console.log(re2.exec(str2),re2.lastIndex); console.log(re2.exec(str2),re2.lastIndex);
  • .nice 答案和好人..haha
猜你喜欢
  • 2015-01-25
  • 1970-01-01
  • 2017-04-10
  • 1970-01-01
  • 1970-01-01
  • 2010-11-23
相关资源
最近更新 更多