Deutsch

Text- und Alltagswerkzeuge · Text-Toolkit

Von Kleene bis JavaScript: eine kurze Geschichte regulärer Ausdrücke

· Hintergrund

reguläre Ausdrücke Javascript Rechenverlauf

Eine Zeitleiste, die endliche Automaten, Unix-Grep-, Perl- und JavaScript-reguläre Ausdrücke verbindet
Original-ToolAcre-Vektorillustration

Verfolgt reguläre Ausdrücke aus der Automatentheorie der 1950er Jahre über ed, grep und Perl bis zur JavaScript-Variante in jedem Browser und erklärt, warum die Syntax so aussieht und welche Funktionen wann eingeführt wurden.

Die seltsame kleine Sprache, die jeder halb kennt – warum sich die Regex-Syntax alt und inkonsistent anfühlt

Reguläre Ausdrücke wirken wie eine über Epochen hinweg zusammengesetzte Sprache, weil sie im Wesentlichen genau das sind. Aus der mathematischen Notation entwickelte sich ein kompakter Kern aus Abwechslung, Wiederholung und Gruppierung zu Editorbefehlen, Befehlszeilenfiltern und Programmiersprachenfunktionen. Die Interpunktion blieb bestehen, während jeder Gastgeber seine eigenen Bequemlichkeiten, Einschränkungen und Terminologie hinzufügte.

Dieser Verlauf erklärt, warum ein Muster vertraut aussehen kann, sich aber zwischen grep, Perl, Python und JavaScript unterschiedlich verhält. „Regex“ ist ein Familienname, keine universelle Grammatik. Für einen autodidaktischen Analytiker besteht die nützliche Lektion nicht darin, sich jeden Dialekt zu merken, sondern darin, die Engine, Flags und Ersetzungsregeln zu identifizieren, bevor er einem geliehenen Muster vertraut.

Kleenes regelmäßige Ereignisse – die Mathematik endlicher Automaten aus den 1950er Jahren, die uns den Stern bescherte

Stephen Cole Kleenes Arbeit über endliche Automaten und „reguläre Ereignisse“ lieferte in den 1950er Jahren die theoretischen Grundlagen. Seine Notation beschrieb Mengen von Symbolsequenzen unter Verwendung von Operationen wie Vereinigung, Verkettung und Schließung. Die Schließungsoperation wurde zum Kleene-Star: `A*` bedeutet null oder mehr Wiederholungen aus A, nicht nur „einmal oder mehrmals wiederholen“.

Die von endlichen Automaten erkannten formalen regulären Sprachen sind enger als viele Konstrukte, die jetzt unter dem Regex-Label verkauft werden. Rückreferenzen können beispielsweise Bedingungen ausdrücken, die über das klassische Modell hinausgehen. Moderne Engines bewahren daher den historischen Namen und einen Großteil der Notation und implementieren gleichzeitig Mustersprachen, deren Fähigkeiten und Ausführungsstrategien über Kleenes ursprüngliches mathematisches Objekt hinausgehen.

Thompson, ed und grep – wie Regex in den Unix-Tools der späten 1960er und frühen 1970er Jahre in die Textbearbeitung Einzug hielt

Ken Thompson verknüpfte die Theorie mit funktionierenden Textwerkzeugen. In seinem Aufsatz „1968 Communications of the ACM“ wurde die Kompilierung regulärer Ausdrücke in Maschinencode zum Durchsuchen von Text beschrieben, und seine frühere Arbeit als Herausgeber trug dazu bei, den Mustervergleich innerhalb der Unix-Linie zu platzieren. Der `ed`-Editor verwendete reguläre Ausdrücke in Befehlen, die übereinstimmende Zeilen auswählten und transformierten.

Der Name `grep` stammt von einem `ed`-Befehl, der üblicherweise als `g/re/p` wiedergegeben wird: Zeilen, die einem regulären Ausdruck entsprechen, global auswählen und ausdrucken. Das frühe grep war nicht die heutige Sammlung von GNU-Optionen, und spätere grundlegende und erweiterte POSIX-Formen unterscheiden sich. Der nachhaltige Wandel war praktischer Natur: Eine kleine symbolische Sprache wurde zu einer alltäglichen Schnittstelle für die Textsuche.

Perl und PCRE – die Erweiterungen, die nicht gierige Quantoren, Lookarounds und die Syntax hinzufügten, die die meisten Tools heute kopieren

Perl hat eine umfangreichere Mustersprache zu einem zentralen Bestandteil der allgemeinen Programmierung gemacht. In allen Versionen stießen Programmierer auf Erfassungsgruppen, Rückverweise, Behauptungen, Lazy-Quantifizierer und Mustermodifikatoren in einem gut sichtbaren Ökosystem. Die Perl-Dokumentation 5 zeichnet Konstrukte wie `*?` für minimale Übereinstimmung und `(?=...)` für positiven Lookahead sowie viele Funktionen auf, die in älteren Unix-Formularen fehlen.

Es ist sicherer zu sagen, dass Perl diesen Stil populär gemacht hat, als ihm die Erfindung aller Erweiterungen zuzuschreiben. PCRE bot bewusst Perl-kompatible Syntax an, während andere Engines ausgewählte Ideen übernahmen und andere ablehnten. Gemeinsame Interpunktion kann unterschiedliche Semantik, Unicode-Verhalten oder Leistung verbergen. „Perl-ähnlich“ beschreibt daher einen breiten Einfluss, keine Garantie dafür, dass ein Perl-Muster übertragbar ist.

Perl hat eine größere praktische Mustersprache populär gemacht; Spätere Motoren wurden selektiv ausgeliehen

JavaScript standardisierte seine eigenen `RegExp`-Objekte und Literalsyntax, wie z. B. `/pattern/gi`, für Programme, die in Browsern und anderen ECMAScript-Umgebungen ausgeführt werden. Seine Variante umfasst einfangende und nicht einfangende Gruppen, Rückverweise, Lookahead, Lazy-Quantifizierer und Zeichenklassen. Spätere Ausgaben fügten der ES2018-Spezifikation benannte Capture-Gruppen und Lookbehind-Assertionen hinzu.

JavaScript ist kein PCRE oder Python mit unterschiedlichen Trennzeichen. Die Verfügbarkeit von Funktionen hängt von der von der Engine implementierten ECMAScript-Edition ab, und Flags sind eher Teil des Verhaltens als der Dekoration. Der MDN-Leitfaden für reguläre Ausdrücke ist die relevante praktische Referenz für die Browsersyntax, aber selbst gültige JavaScript-Beispiele können sich auf Flags stützen, die eine bestimmte Schnittstelle nicht bereitstellt.

JavaScript hat in ES2018 benannte Gruppen und Lookbehind erhalten, aber Engines und Flags unterscheiden sich immer noch

Browser stellen eine JavaScript-Engine für reguläre Ausdrücke in die Nähe gewöhnlicher Textverarbeitung. Eine Seite kann ein Muster kompilieren, Übereinstimmungen zählen und es an `String.prototype.replace` übergeben, ohne den Text an einen speziellen Regex-Dienst zu senden. Diese Verfügbarkeit ermöglicht eine browserseitige Such- und Ersetzungsschnittstelle, obwohl die umgebende Seite dennoch separat auf umfassendere Datenschutzansprüche untersucht werden muss.

Die ToolAcre-Implementierung ruft `new RegExp` innerhalb von `compilePattern` auf, fängt Kompilierungsfehler ab und gibt einen Fehler zurück, anstatt ihn auszulösen. `findReplace` zählt Übereinstimmungen, bevor der Standardersetzungsvorgang angewendet wird. Daher folgen JavaScript-Ersatztokens wie Capture-Referenzen der Host-String-API; Regex-Syntax und Ersetzungssyntax sind verwandte, aber unterschiedliche Sprachen.

Was dies nicht abdeckt – formale Sprachtheorie über die Grundlagen und Engine-Performance-Interna hinaus

Diese kurze Geschichte beweist nicht die Gleichwertigkeit zwischen praktischen Engines und endlichen Automaten, untersucht keine Regex-Ausführungsalgorithmen oder ordnet Implementierungen nicht nach Geschwindigkeit. Backtracking, lineare Zeittechniken und pathologische Muster verdienen eine gesonderte Behandlung. Der ToolAcre-Guard fängt Syntaxfehler ab, erkennt jedoch keinen gültigen Ausdruck, der übermäßiges Backtracking durchführt und den Hauptbrowser-Thread blockiert.

Auch ordnet die Zeitleiste nicht jedes Metazeichen einem einzelnen Erfinder zu. Softwarefunktionen wurden oft durch Veröffentlichungen, Redakteure, Sprachveröffentlichungen und kompatible Neuimplementierungen bereitgestellt und nicht durch eine saubere Übergabe. Die Quellen unterstützen bestimmte Meilensteine; Sie rechtfertigen nicht die einfachere Geschichte, dass ein Produkt den modernen Regex-Großhandel geschaffen hat oder dass spätere Geschmacksrichtungen ein identisches Verhalten geerbt haben.

Das Fazit: Der Regex-Modus des Text Toolkits ist die JavaScript-Variante, sodass Muster aus der Browserdokumentation wie geschrieben funktionieren

Die praktische Vererbung ist in ToolAcre sichtbar: Aktivieren Sie Regex und der Suchtext wird von der JavaScript-Engine des Browsers kompiliert. Lassen Sie Regex deaktiviert und Metazeichen werden mit Escapezeichen versehen, sodass die Suche wörtlich wird. Ganzes Wort umschließt den Ausdruck mit ``-Grenzen im ASCII-Stil, während die Groß-/Kleinschreibung steuert, ob das Flag `i` das immer vorhandene globale Flag `g` begleitet.

Dieses letzte Detail korrigiert das allgemeine Versprechen der Gliederung, dass Browser-Dokumentationsmuster wie geschrieben funktionieren. ToolAcre stellt keine Multiline-, Dot-All-, Sticky- oder Unicode-Flags zur Verfügung, daher müssen Beispiele, die `m`, `s`, `y`, `u` oder `v` erfordern, angepasst werden und einige können dort nicht reproduziert werden. Verwenden Sie das Tool, um unterstützte JavaScript-Muster zu testen, die Ersetzungsanzahl zu lesen und den Vorgang vor der Verfeinerung rückgängig zu machen.