我的正则表达式在在线编辑器中工作,但在FireBug中它使浏览器崩溃

时间:2014-06-28 13:03:27

标签: javascript regex

我写了以下正则表达式来捕捉文本的两个括号内的任何内容:

var rule = /[a-zA-Z0-9]*(\(+[a-zA-Z\s0-9]*\))*[a-zA-Z0-9\s]/;

适用于此网站:http://regex101.com/(javascript部分)

查看窗口的右侧,您会看到底部显示匹配的字符串,这就是我想要的。

但是当我执行以下代码时,它在firebug中崩溃了。为什么?那我怎么能在括号中抓住这个小组?

var rule = /^[a-zA-Z0-9\s]*(\(+[a-zA-Z\s0-9]*\))*[a-zA-Z0-9\s\,]*/;

var str = "He left us (with anger), but came back all cool and modest.";

var res = "";

while((res = rule.exec(str)) !== null)
{
   console.log("Good");
}

console.log(res);

或许我完全错了,错过了什么?

1 个答案:

答案 0 :(得分:3)

  

“但是当我执行以下代码时,在firebug中崩溃了。为什么?”

要在这样的循环中使用.exec(),正则表达式必须是全局的。否则它只是继续获得第一场比赛,导致无限循环。

// make it global ------------------------------------------------v
var rule = /^[a-zA-Z0-9\s]*(\(+[a-zA-Z\s0-9]*\))*[a-zA-Z0-9\s\,]*/g;

当全局时,正则表达式对象变为有状态,并且每个后续.exec()将从最后一次匹配后的字符开始。

如果最后没有匹配,它将返回null,打破循环。


正如其他人在评论中指出的那样,领先的^只能保证一个匹配(无论如何都没有m修饰符),所以你可能想要删除那。然而,这不是崩溃的原因。