2016-02-27 74 views
2

大家都告诉我,如果我有一个像/blah/g这样的正则表达式,我反复exec它在一个字符串上,我会经历所有的比赛,直到我结束。查找所有的正则表达式匹配

但是如果我正则表达式是/^$/g和我的字符串是""?那什么?

这工作得很好:

var re = /bar/g, 
    str = "foobarfoobar"; 
while ((match = re.exec(str)) != null) { 
    alert("match found at " + match.index); 
} 

这进入一个无限循环!

var re = /^$/g, 
    str = ""; 
while ((match = re.exec(str)) != null) { 
    alert("match found at " + match.index); 
} 

为什么,Javascript?为什么?

(更重要的是,如何在地球上我应该通过一个正则表达式匹配的迭代,如果我正则表达式中包含^$和我的字符串也可能会被空字符串???)

+1

不用其他的'/ M'改性剂,在'/^$/G 'regex没有多大意义,因为'/ g'搜索多个匹配,但只能有一个匹配。 –

+0

你需要支持任何用户生成的正则表达式或'^ $'为它没有任何意义遍历任何东西只是一个特例? – Aprillion

+0

由于您没有捕获组,所以''exec'不需要'while'。你可以用'match' – Oriol

回答

3

这里的问题是造成当正则表达式匹配空字符串时,JS正则表达式引擎不会提高其索引。您可以将它 “手动” 一些额外的代码(取自regex101.com示例代码生成页面):

var re = /^$/g; 
 
var str = ''; 
 
if ((m = re.exec(str)) !== null) { 
 
    if (m.index === re.lastIndex) { // Here you manually advance 
 
     re.lastIndex++;    // the index 
 
    } 
 
    alert(m[0]); 
 
}

+1

嗯,还好。呃,我仍然觉得我所看到的所有代码都已经破坏了。当定时器启动时我会接受。 – thedayturns