2008-12-12 6 views
33

Gibt es einen regulären Ausdruck, der mit gültigen regulären Ausdrücken übereinstimmt?Regexp, das mit gültigen Regexps übereinstimmt

(ich weiß, gibt es mehrere Varianten von regexps. Man täte.)

+11

Jemand muss "Gödel Escher Bach; ein ewiger goldener Zopf" lesen. –

+1

+1 für Schildkröten den ganzen Weg hinunter. – Gishu

+0

Warum möchten Sie eine Regexp? Vielleicht gibt es einen anderen Weg, dies zu lösen. –

Antwort

38

Wenn Sie nur überprüfen möchten, ob ein regulärer Ausdruck gültig ist oder nicht, versuchen Sie einfach, ihn mit der Programmiersprache oder der Bibliothek für reguläre Ausdrücke zu kompilieren, mit der Sie arbeiten.

Das Analysieren regulärer Ausdrücke ist alles andere als trivial. Als der Autor von RegexBuddy, habe ich diesen Block ein paar Mal gewesen. Wenn Sie es wirklich tun möchten, verwenden Sie eine Regex, um die Eingabe zu token, und überlassen Sie die Parsing-Logik dem prozeduralen Code. Das heißt, Ihre Regex würde jeweils ein Regex-Token (^, $, \w, (, ) usw.) gleichzeitig entsprechen, und Ihr Verfahrenscode würde prüfen, ob sie in der richtigen Reihenfolge sind.

+1

Hallo Jan, Regexpbuddy sieht fantastisch aus. Wirklich, ich muss es bald bekommen. Vielen Dank für Ihren Kommentar! – Thorsten79

-1

Je nach Ziel würde ich auf jeden Fall vielleicht sagen.

Wenn Sie regexps irgendwo herausfiltern möchten, könnte es sich als schwierig erweisen, da reguläre Ausdrücke in allen Größen und Formen vorkommen und nicht alle mit Schrägstrichen beginnen und enden.

Wenn Sie nur wissen müssen, ob eine Regexp gültig ist, gibt es einen anderen Weg. Abhängig von der Sprache, die Sie verwenden, könnten Sie versuchen/fangen

Wenn Sie genauer sein können, könnte ich versuchen, eine bessere Antwort zu geben, ist die Frage intrigieren.

15

Leider sind die meisten ungültigen regulären Ausdrücke aufgrund von Verschachtelungsfehlern in Klammern ungültig. Dies ist genau der Typ von Zeichenfolgen, die regulären Ausdrücken nicht entsprechen können. (Okay, einige ausgefallene Systeme für reguläre Ausdrücke haben Rekursionserweiterungen, aber das ist selten)

5

Sie brauchen wahrscheinlich einen Parser, keine Regex. Regexes sind mächtige Werkzeuge, sind aber keine Parsing-Werkzeuge. Sie sind beispielsweise für verschachtelte Grammatiken nicht gut geeignet.

+0

Ja, das ist eine Untertreibung. Sie können eben einfach keine verschachtelten Grammatiken machen. – harms

9

Wie bereits erwähnt, können Sie reguläre Ausdrücke aufgrund ihrer rekursiven Natur nicht mit einem regulären Ausdruck beschreiben. Sie benötigen dafür eine kontextfreie Grammatik.

Aber was wäre der Sinn eines solchen regulären Ausdrucks? Wenn Sie nur überprüfen möchten, ob ein regulärer Ausdruck korrekt ist, können Sie einfach versuchen, ihn zu verwenden (Pattern.compile (regexp) in Java) und wenn er schreit, ist er nicht gültig.

4

Von Douglas Crockford Die Programmiersprache JavaScript Video 4 (von 4):

/\/(\\[^\x00-\x1f]|\[(\\[^\x00-\x1f]|[^\x00-\x1f\\\/])*\]|[^\x00-\x1f\\\/\[])+\/[gim]*/

http://video.yahoo.com/watch/111596/1710658 bei etwa -17,20.

+3

Möchten Sie eine Inhaltsangabe geben, anstatt mich zu einem Video-Link zu schicken? –

+1

@LFSR Consulting: Nein, tue ich nicht. Ich habe die Informationen über die Regex in meine Antwort eingefügt. Der Rest des Videos ist für diese Frage irrelevant. Ich habe lediglich Zitierinformationen gegeben. – kajaco

+0

FF3 wirft auf der oben genannten Regexp als syntaktisch falsch !? – ThomasH

41

Gibt es einen regulären Ausdruck, der mit gültigen regulären Ausdrücken übereinstimmt?

Per Definition ist es ganz einfach: No.

Die Sprache aller Regexes ist keineregelmäßig Sprache (nur Blick auf verschachtelte Klammern), und daher kann es keine regelmäßigen Ausdruck sein, es zu analysieren.

+2

+1 für die einzig korrekte und zielgenaue Antwort. –

+3

Ich wette, jemand hat ein Perl-Skript, das es trotzdem tun kann – Decko

Verwandte Themen