具有全局多行无限匹配的RegExp

时间:2014-08-05 08:01:09

标签: javascript regex

好的,所以我试图匹配所有行并获得匹配的字符串索引,但我遇到了一个奇怪的问题

var string = 'a\n',
    regexp = /^.*$/gim;

如果你跑

regexp.exec(string);

它最终将无限匹配,为什么?我问的原因是因为人们在while循环中执行这些类型的匹配很常见,除非你确保前一个匹配索引不是当前索引,否则这将产生一个无限循环。

修改 所以解决我的问题需要我做

while (match = regexp.exec(string)) {
    if (!match[0].length) {
        regexp.lastIndex++;
    }
}

3 个答案:

答案 0 :(得分:2)

因为.*匹配零长度字符串。在字符串的末尾,它总是可以再次匹配。

答案 1 :(得分:1)

它匹配字符串的结尾。当使用m标志时,^等于一行的开头...并且您在结尾处有一个新行,而lastIndex(用于启动该行的值)搜索来自)不会移动,因为它匹配一个空字符串。

为了更好地理解这一点,请尝试使用:

var string = "a\n\n\b\n";

它也永远不会匹配“b”。

答案 2 :(得分:0)

您的字符串变量有2个NEWLINE字符,产生3行字符串

a
b
<<an empty line>>

您的RegEx声明您正在搜索与整行匹配的字符串,.*表示任意字符为0次或更多次

由于空行与.*正则表达式匹配,因此结果会以空字符串结束。