在JavaScript中讲述正则表达式解析异常

Jer*_*ams 7 javascript regex

我正在编写一个允许用户指定正则表达式的应用程序.当然,用户会犯错误,因此我需要一种方法来处理不可解析的正则表达式,并为用户提供有关如何解决问题的可操作建议.

我遇到的问题是抛出的异常new RegExp("something awful")对regex n00bs没有帮助,并且每个浏览器都有不同的消息.例如:

鉴于:

try{
    new RegExp("(pie");
}catch(e){
    console.log(e.message);
}
Run Code Online (Sandbox Code Playgroud)
  • Firefox抛出"未终结的括号".
  • Safari抛出"失踪")
  • Chrome抛出"未终止组"

如果这些消息字符串是用户语言本地化的,或者它们随着时间的推移而漂移,那么这对我来说并不会让我感到惊讶,这使得这是一个疯狂的结,用exception.message解开.

我的目标是捕捉异常,弄清楚它的真正含义,并提出一个更适合初学者的消息.(最后突出显示了无与伦比的paren,在这个例子中.)

我应该使用其他一些异常标识符吗?有没有更好的方法来分辨这些?如果没有这一切,有没有人只是收集了几个最流行的浏览器中所有这些字符串的内容?

Jam*_*mes 3

想法:在运行时弄清楚一切。例如

var tellMeWhatIDidWrong = (function() {

    var tests = {
        '(': 'You did not close your group... duh!',
        ')': 'You seem to have an unmatched parenthesis.',
        '*': 'That token is illegal in that position'
    };

    var errors = {};

    for (var i in tests) {
        try { RegExp(i); } catch(e) { 
            errors[String(e).split(':').pop()] = tests[i];
        }
    }


    return function(regexStr) {
        try { RegExp(regexStr); } catch(e) {
            e = String(e).split(':').pop();
            if (e in errors) {
                return errors[e];
            }
            return 'Unknown error';
        }
        return 'Nothing -- it is fine!';
    };

}());

tellMeWhatIDidWrong('(abc?'); // -> "You did not close your group... duh!"
Run Code Online (Sandbox Code Playgroud)

当然,只有当浏览器的内置错误报告足够具体时,这才有效。他们中的许多人都很糟糕。例如,Opera 绝对没有给出有关该问题的任何提示,因此上述方法将无法正常工作,并且任何其他依赖于 Opera 本地错误消息的解决方案也将无法正常工作。

我建议将正则表达式发送到运行 node.js 的应用程序并获取不错的 V8 错误消息:)