我写了以下正则表达式来捕捉文本的两个括号内的任何内容:
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);
或许我完全错了,错过了什么?
答案 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
修饰符),所以你可能想要删除那。然而,这不是崩溃的原因。