2012-11-29 11 views
7

Ich schreibe eine App, mit der ein Benutzer einen regulären Ausdruck angeben kann. Natürlich machen Benutzer Fehler, daher muss ich mit regulären Ausdrücken umgehen können, die nicht auffindbar sind, und dem Benutzer einige umsetzbare Ratschläge geben, wie das Problem behoben werden kann.Separieren von Ausnahmen für reguläre Ausdrücke parse in JavaScript

Das Problem, das ich habe, ist, dass die Ausnahmen von new RegExp("something awful") nicht hilfreich für Regex n00bs sind, und verschiedene Meldungen pro Browser haben. Zum Beispiel:

Gegeben:

try{ 
    new RegExp("(pie"); 
}catch(e){ 
    console.log(e.message); 
} 
  • Firefox wirft "ungekündigten klammern".
  • Safari wirft „fehlt)“
  • Chrome wirft „Unterminated Gruppe“

Und es würde mich nicht überraschen, wenn diese Nachricht Strings benutzer Sprache lokalisiert sind, oder dass sie schon im Laufe der Zeit driftete , macht dies zu einem verrückten Knoten, um sich mit Ausnahme zu lösen.

Mein Ziel ist es, die Ausnahme zu verstehen, herauszufinden, worum es wirklich geht, und eine viel anfängerfreundlichere Nachricht zu veröffentlichen. (Und schließlich Hervorhebung der nicht übereinstimmenden paren, in diesem Beispiel.)

Gibt es eine andere Ausnahmekennung, die ich verwenden sollte? Gibt es eine bessere Möglichkeit, diese auseinander zu halten? Hat all das gerade versäumt, hat jemand nur gesammelt, was all diese Strings in den verschiedenen beliebtesten Browsern sind?

+1

Ich würde sehen, was einige der beliebten Regex-Online-Test-Seiten tat – mplungjan

+1

Hat die Regex '(abcd})' eine zu wenige Klammern oder eine zu viele? –

+0

Und hier ist ein Trick, um die meisten möglichen Nachrichten zu erhalten. Schreiben Sie ein Skript, das einige gültige aber sehr komplizierte reguläre Ausdrücke enthält. Wirklich alle in JavaScript verfügbaren Regex-Funktionen verwenden und missbrauchen. Und nisten sie und alles natürlich. Dann entfernen, fügen oder ändern Sie ein paar Zeichen in diesen und versuchen sie zu kompilieren. Und speichern Sie alle Fehlermeldungen, die Sie erhalten (zusammen mit der Regex, die es verursacht hat). Aufgrund der Zufälligkeit sollten Sie in der Lage sein, viele Fehlerfälle auszuprobieren, und dank der Automatisierung müssen Sie sich keine Gedanken über Duplikate machen. –

Antwort

3

Idee: Zahlen Sie alles zur Laufzeit aus. Z.B.

Natürlich funktioniert das nur, wenn die eingebaute Fehlermeldung eines Browsers spezifisch genug ist. Viele von ihnen saugen. Z.B. Opera gibt absolut keinen Hinweis auf das Problem, daher wird das obige nicht gut funktionieren, und auch keine andere Lösung wird sich auf die nativen Fehlermeldungen von Opera verlassen.

Ich würde vorschlagen, regexps weg zu einem App läuft node.js und bekommen die schönen V8 Fehlermeldungen :)

+0

Das ist wirklich schlau, und danke fürs Spähen in Opera (was nicht auf meiner Liste stand, um es zu versuchen). Die App hat sogar bereits eine serverseitige Node.js-Komponente, und Sie haben recht, es könnte sinnvoller sein, einfach auf die Hin- und Rückreise zu warten und ausgezeichnete Ratschläge vom Server zu bekommen, anstatt vom Rat des Kunden sofort mittelmäßige Ratschläge einzuholen. –

1

von meinem Kommentar Nach habe ich zusammen ein kleines Skript gehackt zu „ernten“ die möglichen Fehlermeldungen und die Muster, die sie verursachen.

JSFiddle (anprobiert Chrome nur, Ich hoffe, die RegExp Ausnahmeobjekte die gleiche Struktur für andere Browser haben)

Die Idee ist dies: Sie haben einen Arbeits regulären Ausdruck, der so viele Regex Funktionen wie möglich verwendet . Dann mutieren Sie es zufällig (Hinzufügen, Entfernen oder Austauschen von Zeichen) und versuchen Sie es zu kompilieren. Sie können dies ein paar tausend Mal tun und alle Fehlermeldungen sammeln. Hoffentlich ist der Zufall besser darin, mögliche missgebildete Muster zu entwickeln, als jeder von uns es ist.

Sie sollten auf jeden Fall das Grundmuster verbessern, alle regex Features von JavaScript und umfassen alle Meta-Zeichen in der Ersetzungstabelle aufzunehmen. Aber ansonsten scheinen ich konsequent 6 möglichen Fehlermeldungen zu erhalten:

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

Versuchen Sie dieses Skript ausgeführt in anderen Browser, analysieren die Muster, die die Fehler verursacht, und von dort aus sollten Sie in der Lage sein, Ihr Werkzeug zu schreiben.

EDIT:

Okay, wie ich befürchtet habe dies nicht aus der Box in anderen Browsern nicht funktioniert, weil sie die eigentliche Nachricht speichert irgendwo anders innerhalb des Ausnahmeobjekts. Aber ausgehend von Ihrer Frage scheinen Sie bereits herausgefunden zu haben, woher Sie die Nachricht für jeden Browser erhalten sollen, also sollten die Änderungen, die Sie vornehmen müssen, geringfügig sein, hoffe ich.

Verwandte Themen