Der Hauptgrund, warum Regex und HTML nicht mischen? Die Theorie dahinter?

8

Zunächst einmal kann ich nichts anderes tun, als auf das zu verweisen, von dem ich glaube, dass es der berühmteste SO-Post aller Zeiten ist:

RegEx stimmt offene Tags ab, mit Ausnahme von XHTML-eigenen Tags

Nun, ist es überhaupt eine Frage für StackOverflow? Ich weiß es nicht, aber ich werde es versuchen ...

Ich werde aus einer persönlichen Sicht sprechen. Obwohl ich das nie tun musste, weiß ich, dass ich an dem Tag, an dem ich HTML analysieren muss, sicherlich nicht mit Regexes arbeiten werde; Ich werde versuchen, eine HTML-Parsing-Bibliothek zu finden. Gut.

Aber ich weiß nicht warum.

Irgendwann habe ich beschlossen, CSS in Java zu validieren. Ich wusste "durch den Mut", dass Regexes es nicht schneiden würden, also habe ich Parboiled benutzt.

Und ich weiß nicht warum.

Das "Warum" beunruhigt mich. Ich bin kein Neuling mit Regexes überhaupt. Ich kann einfach nicht klar sagen, was Regex-Engines können und was nicht.

Meine Frage ist die folgende: Was ist diese klare Linie? Welche grundlegende Eigenschaft einer Eingabe muss vorhanden sein, damit mathematisch nachgewiesen werden kann, dass jede Regex-Engine Erfolg und Misserfolg nicht zuverlässig bestimmen kann?

Können Sie einen einfachen, theoretischen Input geben, der ein Versagen bei der Fähigkeit einer Regex-Engine bedeutet, eine zuverlässige "Übereinstimmung / keine Übereinstimmung" -Antwort zu geben? Wenn ja, was ist das definierende Merkmal einer solchen Eingabe?

BEARBEITEN Im Sinne dieser Diskussion füge ich eine Aufgabe hinzu, die von einem Beitrag auf SO vorgeschlagen wurde (zu dem ich im Moment den Link nicht finden kann, tut mir leid), was einfacher ist als HTML, aber für die ich nicht regexes: shell command line parsing.

Soweit es die Shell betrifft, sind diese gleichwertig:

%Vor%

Die Shell-Quotierungsmechanismen sind so zahlreich, dass ich in diesem Fall einfach eine Parboiled-Grammatik erstelle ... Aber das ist "aus meinem Bauch raus". Weil ich es wahrscheinlich einfacher finde ... Aber das beweist nicht, dass dies mit Regexes nicht möglich ist.

    
fge 11.06.2013, 22:36
quelle

4 Antworten

6

Reguläre Ausdrücke können reguläre Sprachen bestimmen. Aber HTML ist keine reguläre Sprache. Es ist eine kontextfreie Sprache . Kontextfreie Sprachen sind eine Obermenge von regulären Sprachen.

Grundsätzlich ist jede Sprache, die rekursive Elemente enthalten kann, nicht regulär. Normale Sprachen müssen "flach" sein, so dass es keine Verschachtelung geben kann. In HTML beispielsweise kann ein <div> innerhalb eines anderen verschachtelt werden, und es gibt keine Begrenzung für die Tiefe, in der sie verschachtelt werden können. Es ist diese Art der allgemeinen Verschachtelung, mit der reguläre Ausdrücke nicht umgehen können.

    
recursive 11.06.2013 22:41
quelle
3

Reguläre Ausdrücke sind meist dazu da, ein gegebenes Muster mit einer Eingabe-Zeichenfolge zu vergleichen und zu sehen, ob das erfolgreich ist. Das ist ihr Hauptziel. RE-Bibliotheken bieten zusätzliche Funktionen wie das Abrufen von Unterparts einer Eingabezeichenfolge basierend auf der Übereinstimmung, aber dies ist nur für wenige Teile möglich. Wenn Sie eine vollständige Darstellung Ihrer Eingabe benötigen, benötigen Sie einen Syntaxbaum. Jeder Parser kann dies leicht für Sie generieren, da dies eine ihrer Aufgaben ist. Mit RE müssen Sie das auch manuell tun.

Ein weiterer Punkt ist die Komplexität Ihres Ausdrucks, wenn Sie reguläre Ausdrücke verwenden würden. Schwierig, auf Fehler zu prüfen, und man bekommt meistens alles oder nichts, entweder stimmt es erfolgreich überein (und du bekommst deine gewünschten Informationen) oder du bekommst nichts und musst herausfinden, was damit nicht stimmt. Mit einem Parser-Generator können Sie interaktiv Ihre Grammatik erstellen, um mehr und mehr Informationen zu erhalten, ganz zu schweigen davon, dass Sie wahrscheinlich bereits eine HTML-Grammatik für jeden relevanten Parser dort draußen finden.

Vergessen Sie nicht die Rückmeldung für eine ungültige Eingabe. Mit RE bekommst du nichts. Mit einem Parser erhalten Sie Fehlermeldungen, die Sie auf das eigentliche Problem hinweisen. Einige Parser (wie die von ANTLR generierten) können sogar mit einfachen Syntaxfehlern fertig werden und trotzdem einen brauchbaren Syntaxbaum für Sie erzeugen.

    
Mike Lischke 13.06.2013 11:54
quelle
1

Sie sagen, Sie haben gehört, dass Regexes HTML nicht analysieren können. Das ist irreführend: Es gibt eine Mehrdeutigkeit der Terminologie.

Ursprünglich hatte der Begriff "Regex" eine spezifische, mathematische Bedeutung. Natürlich haben Programmiersprachen Regex-Engines erfunden. Aber mit der Zeit wuchsen diese Motoren an Kraft (Rückreferenzen, Lookarounds, rekursive Muster, ...). Es ist nicht mehr wahr, dass die ursprünglichen "regulären Sprachen" die einzigen Sprachen sind, die von Regex-Engines erkannt werden.

Zum Beispiel erkennt /^(a*)b$/ die Zeichenfolgen b , aba , aabaa , aaabaaa usw .; Dies ist keine reguläre Sprache.

Ich denke, Sie können eine Regex schreiben, um die HTML-Gültigkeit zu testen, wenn Sie das wirklich wollen. (Sie nicht.) In der Praxis wird es eine Bibliothek dafür geben, in welcher Sprache Sie auch verwenden, aber Regexes können einfacher sein, abhängig von Ihrem Anwendungsfall.

    
David Knipe 13.06.2013 20:32
quelle
0

Ich denke, die beste Antwort, die Sie hier bekommen können, ist das alte Sprichwort: "Wenn alles, was Sie haben, ein Hammer ist, sieht die ganze Welt wie ein Nagel aus." Reguläre Ausdrücke können fast alles tun. Ihre Stärke liegt in ihrer Fähigkeit, mit jedem String zu arbeiten. Aber nur weil Sie können etwas verwenden, heißt das nicht, dass Sie sollten . Reguläre Ausdrücke sind langsam und weitgehend ineffizient (Sie können sie auf viele Arten optimieren, aber nur sehr wenige kennen diese Techniken und noch weniger benötigen tatsächlich die Zeit, um sie zu implementieren und ihre regulären Ausdrücke gründlich zu testen und zu überprüfen ).

Im Fall von HTML gibt es bessere Tools. Tools, die schneller als reguläre Ausdrücke sind und besser für die Arbeit mit HTML geeignet sind (in der Lage, Knotenbäume usw. zu erstellen). Es ist nicht so sehr, dass Sie keine regulären Ausdrücke zum Analysieren von HTML verwenden sollten, sondern dass es bessere Werkzeuge gibt. Warum würden Sie versuchen, einen Baum mit einem Buttermesser zu sehen, wenn Sie eine Kettensäge verwenden können?

    
Chris Pratt 12.06.2013 19:38
quelle