1

我所做的:

  • 确保 Firebug 正常工作。
  • 在 isWrappedInParens() 函数中放置一个断点。
  • 导航到我的网络应用程序。
  • 触发对 isWrappedInParens() 的调用。
  • 逐步执行 isWrappedInParens()。一切都很好,但它并没有超过指示为“CRASH POINT”的代码行。
  • 我也尝试过没有运行 Firebug 或有断点,但它仍然冻结。

我注意到:

  • 在大多数情况下, isWrappedInParens() 工作正常。
  • 当它不起作用时,Firefox 会冻结。不过,我仍然可以最小化/展开/关闭窗口。
  • 我还注意到,当测试字符串稍短(括号更少)时,firefox 会挂起,但最终会正确完成(约 30 秒)。

导致 Firefox 崩溃的示例字符串

// Note that this is not wrapped in parentheses,
// since it is two separate sets of nested parentheses
var test = "(the OR (and) OR (and) OR (and)) AND ((to) OR (to) OR (to))";

背景

  • 浏览器:火狐3.6.18
  • webapp 是一个码头应用程序。

代码

isWrappedInParens = function(str){
    if(_.isNull(str)) {
        return false;
    }
    str = str.trim();

    var pattern = /^[(](([(][^()]+[)]|[^()]+)|[(]([(][^()]+[)]|[^()]+)+[)])+[)]$/;

    var matchesPattern;
    try{
        matchesPattern = str.match(pattern) || null; //CRASH POINT!!!!!!!!!!!
    }catch(err){
        return false; //Note that no error is ever caught from freezing
    }

    var isWrapped = !_.isUndefined(matchesPattern) && !_.isNull(matchesPattern);
    return isWrapped;
}

正则表达式的来源:

// Atoms, building blocks for the expressions
var parenAtom = "[(][^()]+[)]";
var nonParenAtom = "[^()]+";

// Expressions, building blocks for the final regular expression
var baseCase = "(" + parenAtom + "|" + nonParenAtom + ")";
var nestedCase = "[(]_base_[)]"
    .replace("_base_", baseCase);

// Regular Expression
var wholeCase = "^[(](_base_|_nested_)+[)]$"
    .replace("_base_", baseCase)
    .replace("_nested_", nestedCase);
var pattern = new RegExp(wholeCase, "");
4

1 回答 1

1

从我的评论:

浏览 Firefox 错误数据库,发现了许多正则表达式错误,并松散地归类为“指数行为”错误。其中大部分已在较新版本的浏览器中得到修复。

在这个错误中,Brendan Eich 对这个问题发表了一些评论,他还列出了其他几个错误(一些非常古老)。那里的另一条评论暗示了 Firefox 4 中的“正则表达式大修”,表明许多变化早在那时就发生了。

于 2012-10-10T19:54:04.397 回答