Reguläre Ausdrücke können keine rekursiven Strukturen identifizieren . Dies ist die grundlegende Einschränkung.
Nehmen wir JSON - es ist ein ziemlich einfaches Format, aber da ein Objekt andere Objekte als Elementwerte enthalten kann (willkürlich tief), ist die Syntax rekursiv und kann nicht von einem regulären Ausdruck analysiert werden. Andererseits kann CSV von regulären Ausdrücken analysiert werden, da es keine rekursiven Strukturen enthält.
Kurz gesagt, reguläre Ausdrücke lassen nicht zu, dass sich das Muster auf sich selbst bezieht. Sie können nicht sagen: An dieser Stelle in der Syntax stimmen Sie wieder mit dem gesamten Muster überein. Um es anders auszudrücken, reguläre Ausdrücke stimmen nur linear überein. Sie enthalten keinen Stapel, der es ermöglicht, zu verfolgen, wie tief ein verschachteltes Muster ist.
Beachten Sie, dass es nichts damit zu tun hat, wie komplex oder verworren das Format ansonsten ist. S-Ausdrücke sind wirklich sehr einfach, können aber nicht mit einem regulären Ausdruck analysiert werden. CSS2 hingegen ist eine recht komplexe Sprache, enthält jedoch keine rekursiven Strukturen und kann daher mit einem regulären Ausdruck analysiert werden. (Dies gilt jedoch nicht für CSS3, da CSS-Ausdrücke eine rekursive Syntax haben.)
Das liegt also nicht daran, dass es hässlich oder komplex oder fehleranfällig ist, HTML nur mit regulären Ausdrücken zu analysieren. Es ist einfach nicht möglich .
Wenn Sie ein Format analysieren müssen, das rekursive Strukturen enthält, müssen Sie die Verwendung regulärer Ausdrücke mindestens durch einen Stapel ergänzen, um die Ebene rekursiver Strukturen zu verfolgen. So funktioniert normalerweise ein Parser. Reguläre Ausdrücke werden verwendet, um die "linearen" Teile zu erkennen, während benutzerdefinierter Code außerhalb des regulären Ausdrucks verwendet wird, um die verschachtelten Strukturen zu verfolgen.
Normalerweise wird das Parsen so in separate Phasen aufgeteilt. Tokenisierung ist die erste Phase, in der reguläre Ausdrücke verwendet werden, um die Eingabe in eine Folge von "Token" wie Wörter, Interpunktion, Klammern usw. zu unterteilen. Parsing ist die nächste Phase, in der diese Token in eine hierarchische Struktur, einen Syntaxbaum, zerlegt werden.
Wenn Sie also hören, dass HTML oder C # nicht mit regulären Ausdrücken analysiert werden können, beachten Sie, dass reguläre Ausdrücke immer noch ein kritischer Bestandteil der Parser sind. Sie können eine solche Sprache nur mit regulären Ausdrücken und ohne Hilfscode analysieren .