7

ユーザーが正規表現を指定できるアプリを書いています。もちろん、ユーザーは間違いを犯すので、解析できない正規表現を処理し、問題を解決するための実用的なアドバイスをユーザーに提供する方法が必要です。

私が抱えている問題は、スローされた例外new RegExp("something awful")が正規表現n00bsには役立たず、ブラウザごとにメッセージが異なることです。例えば:

与えられた:

try{
    new RegExp("(pie");
}catch(e){
    console.log(e.message);
}
  • Firefoxは「終了していない括弧」をスローします。
  • Safariは「missing)」をスローします
  • Chromeは「未終了のグループ」をスローします

そして、それらのメッセージ文字列がユーザー言語にローカライズされている場合、または時間の経過とともにドリフトしている場合でも、これをexception.messageと結び付けるのはおかしなことになります。

私の目標は、例外をキャッチし、それが実際に何であるかを理解し、はるかに初心者に優しいメッセージを出すことです。(そして、この例では、最終的には比類のないパレンを強調表示します。)

使用すべき他の例外識別子はありますか?これらを区別するためのより良い方法はありますか?それがすべて失敗した場合、最も人気のあるいくつかのブラウザでこれらすべての文字列が何であるかを誰かが収集したことがありますか?

4

3 に答える 3

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!"

もちろん、これはブラウザの組み込みのエラー報告が十分に具体的である場合にのみうまく機能します。それらの多くは吸う。たとえば、Operaはこの問題についてまったくヒントを与えないため、上記はうまく機能せず、Operaのネイティブエラーメッセージに依存する他のソリューションも機能しません。

node.jsを実行しているアプリに正規表現を送信してV8エラーメッセージを受け取ることをお勧めします:)

于 2012-11-29T21:37:04.993 に答える
1

PEG.jsまたはJISONを使用して、正規表現パーサーを作成します。特定の一貫したエラーを取得できるようになります。

このファイルには、正規表現のYACC文法が含まれています。http://swtch.com/usr/local/plan9/src/cmd/grep/grep.y ; JISONでの使用はそれほど難しくないかもしれません。

PERL正規表現のBNF文法:http ://www.cs.sfu.ca/~cameron/Teaching/384/99-3/regexp-plg.html

于 2012-11-29T21:46:41.220 に答える
1

コメントに続いて、考えられるエラーメッセージとその原因となるパターンを「収集」するための小さなスクリプトをまとめました。

JSFiddle(Chromeでのみ試してみましたが、RegExp例外オブジェクトが他のブラウザーでも同じ構造になっていることを願っています

アイデアは次のとおりです。可能な限り多くの正規表現を使用する正規表現が機能しています。次に、ランダムに変更(文字の追加、削除、または交換)して、コンパイルを試みます。これを数千回実行して、すべてのエラーメッセージを収集できます。うまくいけば、私たちの誰よりも、可能性のある奇形のパターンを思い付くのにチャンスが良いでしょう。

JavaScriptによって提供されるすべての正規表現機能を含め、置換テーブルにすべてのメタ文字を含めるために、基本パターンを確実に改善する必要があります。しかし、そうでなければ、私は一貫して6つの可能なエラーメッセージを受け取るようです:

Unterminated group
Invalid group    
Nothing to repeat
Unmatched ')'
Unterminated character class
\ at end of pattern

このスクリプトを別のブラウザーで実行して、エラーの原因となったパターンを分析すると、そこからツールを作成できるようになります。

編集:

さて、私が恐れていたように、これは箱から出して他のブラウザでは機能しません。なぜなら、それらは実際のメッセージを例外オブジェクト内のどこかに保存しているからです。しかし、あなたの質問から判断すると、すべてのブラウザのメッセージをどこから取得するかはすでにわかっているようです。したがって、必要な変更はわずかなものである必要があります。

于 2012-11-29T22:05:58.670 に答える