Reguläre Ausdrücke - Jeffrey E. F. Friedl - E-Book

Reguläre Ausdrücke E-Book

Jeffrey E. F. Friedl

4,8

Beschreibung

Reguläre Ausdrücke sind ein leistungsstarkes Mittel zur Verarbeitung von Texten und Daten. Wenn Sie Reguläre Ausdrücke noch nicht kennen, wird Ihnen dieses Buch eine ganz neue Welt eröffnen. Aufgrund der ausgesprochen detaillierten und tiefgründigen Behandlung des Themas ist dieses Buch aber auch für Experten eine wahre Trouvaille. Die neue Auflage dieses anerkannten Standardwerks behandelt jetzt auch die Unterstützung regulärer Ausdrücke in PHP sowie Suns java.util.regex. Der klare und unterhaltsame Stil des Buchs hat schon Tausenden von Programmierern das an sich trockene Thema nähergebracht, und mit den vielen Beispielen zu Problemen aus dem Programmieralltag ist Reguläre Ausdrücke eine praktische Hilfe bei der täglichen Arbeit. Reguläre Ausdrücke sind überall Sie sind standardmäßig in Perl, PHP, Java, Python, Ruby, MySQL, VB.NET und C# (und allen Sprachen des.NET-Frameworks) sowie anderen Programmiersprachen und Werkzeugen eingebaut. Dieses Buch geht detailliert auf die Unterschiede und Gemeinsamkeiten bei der Behandlung regulärer Ausdrücke in diesen Sprachen und Werkzeugen ein. Besonders ausführlich werden die Regex-Features von Perl, Java, PHP und.NET behandelt. Reguläre Ausdrücke sind mächtig Reguläre Ausdrücke sind sehr leistungsfähig und flexibel. Dennoch bleibt ihre Anwendung oft unter ihren Möglichkeiten. Mit regulären Ausdrücken können Sie komplexe und subtile Textbearbeitungsprobleme lösen, von denen Sie vielleicht nie vermutet hätten, daß sie sich automatisieren lassen. Reguläre Ausdrücke ersparen Ihnen Arbeit und Ärger, und viele Probleme lassen sich mit ihnen auf elegante Weise lösen.

Sie lesen das E-Book in den Legimi-Apps auf:

Android
iOS
von Legimi
zertifizierten E-Readern
Kindle™-E-Readern
(für ausgewählte Pakete)

Seitenzahl: 950

Das E-Book (TTS) können Sie hören im Abo „Legimi Premium” in Legimi-Apps auf:

Android
iOS
Bewertungen
4,8 (24 Bewertungen)
20
4
0
0
0
Mehr Informationen
Mehr Informationen
Legimi prüft nicht, ob Rezensionen von Nutzern stammen, die den betreffenden Titel tatsächlich gekauft oder gelesen/gehört haben. Wir entfernen aber gefälschte Rezensionen.



Reguläre Ausdrücke

Jeffrey E. F. Friedl

Editor

Volker Bombien

Copyright © 2009 O'Reilly Verlag GmbH & Co.KG

Die Informationen in diesem Buch wurden mit größter Sorgfalt erarbeitet. Dennoch können Fehler nicht vollständig ausgeschlossen werden. Verlag, Autoren und Übersetzer übernehmen keine juristische Verantwortung oder irgendeine Haftung für eventuell verbliebene Fehler und deren Folgen.

Alle Warennamen werden ohne Gewährleistung der freien Verwendbarkeit benutzt und sind möglicherweise eingetragene Warenzeichen. Der Verlag richtet sich im Wesentlichen nach den Schreibweisen der Hersteller. Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.

Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie; detaillierte bibliografische Daten sind im Internet über http://dnb.ddb.de abrufbar.

Die Darstellung von Eulen im Zusammenhang mit dem Thema Reguläre Ausdrücke ist ein Warenzeichen von O'Reilly Media, Inc.

Dieses Buch ist auf 100% chlorfrei gebleichtem Papier gedruckt.

Satz: Andreas Karrer, Zürich

O'Reilly Media Germany

Widmung

For

For LM For putting up with me.

And for the years I worked on this book, for putting up without me.

Vorwort von Jeffrey Friedl zur deutschen Übersetzung der 1. Auflage

Von dem einen Jahr Deutschunterricht in der High School ist mir vor allem eines in Erinnerung geblieben: wie viel Englisch ich da gelernt habe. Wir haben die deutsche Grammatik von Grund auf gelernt, und erst dann begriff ich den Unterschied zwischen »who« und »whom« im Englischen. Jahre später habe ich einen Freund aus Linz auf die gleiche Art verblüfft, nur umgekehrt, als ich ihm erklärte, dass im Deutschen die Höflichkeitsform und die dritte Person Plural gleich gebildet werden – »Sie sind/sie sind«. Für ihn war das ganz einfach so, er hat sich diese Eigenheit nie überlegt und hat die zwei Formen nie verglichen.

So ist es wohl mit vielem: Oft sieht ein unvoreingenommener Betrachter Dinge, die ein Experte nicht sieht, oder der ungewohnte Blickwinkel verhilft dem Experten zu neuen Erkenntnissen.

Ich habe über Jahre technische Lehrbücher benutzt. Manchmal, bei einem wirklich schlecht geschriebenen Buch, habe ich mich darüber geärgert, wie wenig Arbeit sich der Autor mit seinem »Werk« gemacht hat. Seltener habe ich über die viele Arbeit gestaunt, die hinter einem gut geschriebenen Buch stecken musste. Aber meistens habe ich mir gar nichts zu Büchern gedacht. Das hat sich geändert, als ich mich mit dem Gedanken anfreundete, selbst ein Buch zu schreiben. Plötzlich erfasste ich die Menge der Arbeit, die zu einem (gut geschriebenen?) Buch nötig ist. Ich habe mir große Mühe gegeben, ein fehlerfreies Buch zu schreiben – aber das ist natürlich ein Ding der Unmöglichkeit. Ich habe den Text so oft gelesen, dass ich ihn nicht mehr sehen konnte – mein Bruder Steve hat einen besonders peinlichen Grammatikfehler in kaum fünf Minuten gefunden, und mein Bruder Mike fand in genauso kurzer Zeit einen Rechtschreibfehler.

Wochen vergingen, und meine Leser haben mit ihrem unvoreingenommenen Blick hier und dort Fehler entdeckt. Und doch: Wer ein Buch liest, um es zu übersetzen, liest ganz anders, auf einer anderen Ebene als ein normaler Leser. Andreas hat etliche kleine und einige nicht so kleine Fehler gefunden und korrigiert. Immerhin, nicht alle Korrekturen von Andreas wurden in die deutsche Ausgabe aufgenommen – er hat auch mein Englisch korrigiert!

Andreas hat mich auch darauf hingewiesen, dass viele der Beispiele in meinem Buch sehr auf die englischen oder amerikanischen Gegebenheiten ausgerichtet sind. Die Beispiele haben ohnehin schon viel Mühe gemacht: Es war für mich sehr schwierig, Beispiele zu finden, die leicht verständlich und doch praxisnah, aber nicht zu stark auf Unix bezogen sind. Auf kulturelle Eigenheiten habe ich nicht auch noch geachtet. Das ist nur recht und billig, aber es hat die Arbeit des Übersetzers erschwert. An manchen Stellen werden Sie an den deutschen Sprachraum angepasste Beispiele finden – die sind von Andreas.

Ein anderer Gesichtspunkt ist der, wie ein Leser das Buch wohl verwenden wird. Ich bin mit japanischen Zeichensätzen und deren Problemen sehr vertraut, und doch befasst sich der größte Teil des Buches mit normalen ASCII-Zeichen, wie sie der typische amerikanische Leser benutzt. Dagegen habe ich nicht allzu viel Erfahrung mit Latin-1 und ähnlichen Zeichensätzen, an denen deutsche Leser zweifellos interessiert sind, aber die Grundlagen dazu sind im Buch erwähnt. Diese grundlegenden Methoden sind überall anwendbar, sei es in ASCII oder in irgendeiner anderen Zeichencodierung.

Ich habe nur zwei Jahre Deutsch gelernt, aber es hat mir bei Reisen nach Deutschland und Österreich sehr geholfen (zumindest bis ich begonnen habe, Japanisch zu lernen). Ich hatte zwar Unterricht in Englisch, Spanisch, Deutsch und Französisch, aber sprechen kann ich nur Englisch und Japanisch. Ein bisschen Deutsch ist übrig geblieben, und ich bin gespannt, ob ich in Andreas' Übersetzung Fehler finde. Ich bezweifle das zwar, aber so würde sich der Kreis schließen. Das erinnert mich auch an meine eigenen Wurzeln – alle vier Großeltern meines Vaters zogen aus einem Dorf in der Nähe Münchens in die USA. Ich habe das Dorf 1989 besucht, und obwohl ich keine Verwandten fand, wurde ich doch wie jemand behandelt, der zur Familie gehört. Und im Telefonbuch gab es eine Menge Friedls.

Im Deutschunterricht in der High School war »oft und gern« einer meiner Lieblingsausdrücke. Ich habe auf meinen Europareisen kaum Verwendung dafür gefunden, aber jetzt ergibt sich eine: Ich hoffe, dass Sie das Buch schätzen und dass Sie es »oft und gern« zur Hand nehmen.

Jeffrey

Santa Clara, Kalifornien, USA

August 1997

Vorwort

In diesem Buch geht es um ein mächtiges Werkzeug mit dem Namen »Reguläre Ausdrücke«

Sie werden lernen, wie man mit regulären Ausdrücken Probleme lösen kann und wie man alles aus den Programmen herausholt, die reguläre Ausdrücke verwenden. Nicht nur das: In diesem Buch geht es darum, wie man reguläre Ausdrücke meisterhaft verwendet.

Reguläre Ausdrücke sind in einer großen Anzahl von Programmen eingebaut (Editoren, Textverarbeitungssysteme, Systemwerkzeuge, Datenbanken usw.), aber ihr volles Potenzial spielen sie in Programmiersprachen aus, zum Beispiel in Java und JScript, Visual Basic und VBScript, JavaScript und ECMAScript, C, C++, C#, elisp, Perl, Python, Tcl, Ruby, PHP, sed und awk. In manchen von diesen Programmiersprachen sind die regulären Ausdrücke das eigentliche Herz der Sprache.

Es gibt gute Gründe dafür, dass reguläre Ausdrücke in derart vielen Programmen und Programmiersprachen vorkommen: Reguläre Ausdrücke sind äußerst ausdrucksstark. Auf der untersten Ebene beschreibt ein regulärer Ausdrück ein Textstück. Man kann damit etwa Benutzereingaben überprüfen oder große Datenmengen durchsieben. Auf einer höheren Ebene lassen sich Daten mit regulären Ausdrücken meistern und kontrollieren: Die Daten arbeiten für Sie. Meisterschaft im Umgang mit regulären Ausdrücken bedeutet Meisterschaft im Umgang mit Daten.

Warum ich dieses Buch geschrieben habe

Die erste Auflage dieses Buches hatte ich 1996 geschrieben, einfach weil es nötig war. Es gab keine gute Dokumentation zu regulären Ausdrücken, und so wurden viele Möglichkeiten zu ihrem Einsatz nicht genutzt. Die existierenden Dokumentationen beschränkten sich weitgehend auf die unterste, sehr technische Ebene der regulären Ausdrücke. Mir erschien das, als ob man jemandem das Alphabet einbleut und dann erwartet, dass er fließend eine Fremdsprache schreibt.

In den fünfeinhalb Jahren zwischen der ersten und der zweiten Auflage hat sich das Internet auf breiter Basis durchgesetzt, und vielleicht ist es kein Zufall, dass sich in dieser Zeit auch die Welt der regulären Ausdrücke beträchtlich erweitert hat. Die regulären Ausdrücke in fast allen Werkzeugen und Programmiersprachen wurden verbessert und wurden ausdrucksstärker. In Perl, Python, Tcl, Java und Visual Basic wurden neue Regex-Backends entwickelt. Neue Programmiersprachen mit regulären Ausdrücken tauchten auf und verbreiteten sich – zum Beispiel Ruby, PHP und C#. Dennoch blieb der Kern des Buches – wie man reguläre Ausdrücke wirklich versteht und wie man das Letzte aus ihnen herausholt – wichtig und aktuell.

Immerhin zeigten sich an der ersten Auflage gewisse Alterserscheinungen. Naturgemäß fehlten die Neuerungen bei regulären Ausdrücken, und auch die Entwicklungen, die sich aus der Ausbreitung des Internets und des World Wide Web ergaben. Die zweite Auflage kam im Jahr 2002 heraus, das gerade für die regulären Ausdrücke ein sehr aktives war: Sun kam mit Java 1.4 (mit java.util.regex) heraus, Perl mit der Version 5.8 und Microsoft mit .NET. Alle diese Versionen wurden in die 2. Auflage aufgenommen. Rückblickend bereue ich vor allem, dass ich in dieser Auflage PHP zu wenig Beachtung geschenkt hatte. In den vier Jahren seit der zweiten Auflage wurde PHP zu einem wichtigen Werkzeug, und es ist nur richtig, dass PHP in diesem Buch gebührend behandelt wird.

In dieser dritten Auflage wird PHP in den ersten Kapiteln gleichberechtigt mit den anderen Sprachen behandelt; es gibt nun zudem ein eigenes Kapitel zu PHP. Außerdem wurde das Kapitel zu Java neu geschrieben und erweitert, es wurden dabei die Neuerungen von Java 1.5 und 1.6 berücksichtigt.

Zielpublikum

Das Buch soll jeden ansprechen, der die Möglichkeit hat, reguläre Ausdrücke zu benutzen. Gerade wenn Sie die volle Kraft noch nicht begreifen, die den regulären Ausdrücken innewohnt, kann dieses Buch Ihnen eine ganz neue Welt eröffnen. Dieses Buch soll Ihren Blick erweitern, auch wenn Sie schon viel über reguläre Ausdrücke wissen. Nachdem die erste Auflage dieses Buches herausgekommen war, habe ich nicht selten E-Mails bekommen, in denen die Leser schrieben: »Ich hatte geglaubt, dass ich reguläre Ausdrücke verstehe. Dann habe ich Reguläre Ausdrücke gelesen. Jetzt verstehe ich.«

Programmierer, die Texte verarbeiten müssen – die ganze Webprogrammierung fällt darunter –, finden hier eine Fülle von Einzelheiten, Tipps, Hinweisen und Einsichten in das Thema. Den gebotenen Detailreichtum und Tiefgang findet man sonst schlicht nirgends.

Reguläre Ausdrücke sind ein Konzept – eines, das auf verschiedenste Weise in vielen Programmen (in viel mehr Programmen, als in diesem Buch beschrieben werden) verwirklicht worden ist. Wenn Sie die generelle Idee verstehen, ist es nur ein kleiner Schritt zur Beherrschung einer spezifischen Implementation. Das Buch konzentriert sich auf dieses Konzept, und das meiste Wissen in den Beispielen geht über die verwendete Sprache hinaus.

Wie man dieses Buch lesen soll

Das Buch ist zum Teil Leitfaden, zum Teil Handbuch und zu einem anderen Teil eine Erzählung; je nachdem, wie Sie es benutzen. Leute mit Erfahrung mit regulären Ausdrücken werden gleich zu den Kapiteln weiterblättern wollen, die sich mit ihrem Lieblingswerkzeug befassen. Ich möchte davon abraten.

Man profitiert am meisten von diesem Buch, wenn man die ersten sechs Kapitel als Erzählung liest. Nach meiner Erfahrung führen gewisse Gewohnheiten und eine bestimmte Art des Denkens viel leichter zum richtigen Verständnis. Dieses Verständnis entwickelt sich über etliche Seiten, man kann es nicht durch ein paar Einträge aus einer Tabelle absorbieren.

In der Erzählung bilden die ersten sechs Kapitel die Basis für die vier Kapitel am Ende, in denen die Eigenheiten von Perl, Java, .NET und PHP behandelt werden. Ich habe überall Querverweise eingestreut und harte Arbeit investiert, um den Index so nützlich wie möglich zu machen. (Das Buch enthält über 1000 Querverweise, diese werden meist mit einer »« und einer Seitenzahl dargestellt.)

Ohne die Erzählung kann das Buch nicht sinnvoll als Handbuch benutzt werden. Wenn Sie die Erzählung nicht kennen, werden Sie eine Tabelle wie die auf „Programmversionen in diesem Buch“ anschauen und glauben, dass darin sämtliche Informationen enthalten wären. Aber ein großer Teil des Grundwissens ist nicht in den Tabellen enthalten, sondern nur in der Geschichte dazu. Wenn Sie die Erzählung und damit den Hintergrund kennen, kommt Ihnen angesichts einer Tabelle das Relevante in den Sinn, oder Sie wissen, was Sie nachschlagen müssen.

Der Aufbau des Buches

Die zehn Kapitel dieses Buches können in drei große Abschnitte unterteilt werden:

Die Einführung

Kapitel 1 führt in die Konzepte von regulären Ausdrücken ein.

Kapitel 2 wendet reguläre Ausdrücke auf Probleme der Textverarbeitung an.

Kapitel 3 gibt einen Überblick über Features und Werkzeuge und enthält einen kleinen geschichtlichen Abriss.

Die Details

Kapitel 4 erklärt im Detail, wie reguläre Ausdrücke funktionieren.

Kapitel 5 beleuchtet die Erkenntnisse aus Kapitel 4 anhand einiger Beispiele.

Kapitel 6 hat als Hauptthema Effizienzbetrachtungen.

Einzelne Programmiersprachen

Kapitel 7 behandelt Perl und seine regulären Ausdrücke.

Kapitel 8 beschreibt das java.util.regex-Paket von Sun.

Kapitel 9 beschreibt die sprachenübergreifende Implementation von regulären Ausdrücken in .NET.

Kapitel 10 behandelt die preg-Funktionen in PHP.

Die Einführung

Die Einführung befördert den absoluten Anfänger zu jemandem, der weiß, worum es geht. Leser, die einige Erfahrung mit regulären Ausdrücken besitzen, werden sie nur überfliegen, aber besonders Kapitel 3 empfehle ich auch den Experten.

Kapitel 1, Einführung in reguläre Ausdrücke, wendet sich an die absoluten Anfänger. Ich benutze das weitverbreitete Programm egrep, um Ideen und Begriffe einzuführen, und zeige meine Art, in regulären Ausdrücken zu denken, um eine gemeinsame Basis für die späteren Kapitel vorzubereiten. Auch Leser mit Erfahrung sollten das Kapitel zumindest überfliegen.

Kapitel 2, Erweiterte einführende Beispiele, behandelt Textverarbeitung mit einer Programmiersprache, die reguläre Ausdrücke unterstützt. Die zusätzlichen Beispiele bilden die Grundlage für die weitergehende Behandlung in den späteren Kapiteln, und sie illustrieren die Gedankengänge, die hinter dem eigentlichen Schreiben regulärer Ausdrücke stehen. Damit sich ein Gefühl entwickelt, wie man »sich regulär ausdrückt«, wird ein nicht-triviales Problem behandelt und Lösungen dafür gleich in zwei Programmiersprachen angeboten, die reguläre Ausdrücke unterstützen.

Kapitel 3, Features und Dialekte, gibt einen Überblick auf das weite Feld der regulären Ausdrücke, wie man sie in modernen Programmierwerkzeugen vorfindet. Aus der turbulenten Geschichte der regulären Ausdrücke wird verständlich, warum sich die heutigen Geschmacksrichtungen unterscheiden. Das Kapitel gibt auch Einblicke in die Evolution regulärer Ausdrücke und der damit verknüpften Programme. Am Ende des Kapitels finden Sie einen »Führer durch die Kapitel für Fortgeschrittene«. Dieser dient als Straßenkarte, um aus dem folgenden Material das meiste herauszuschöpfen.

Die Details

Wenn die Grundlagen verstanden sind, wird es Zeit, sich um das Wie und das Warum zu kümmern. »Gib einem Menschen einen Fisch, und er wird einmal satt werden. Zeige ihm, wie man Fische fängt, und er wird nie mehr Hunger leiden.« Ganz so wie in dieser kleinen Parabel kann man Gelerntes nur dann immer und überall anwenden, wenn ein wirkliches Verständnis von regulären Ausdrücken vorhanden ist.

Kapitel 4, Wie Regex-Maschinen arbeiten, legt einen schnelleren Gang ein und stößt zum Kern dieses Buches vor. Die interne Arbeitsweise von Maschinen, die reguläre Ausdrücke bearbeiten, wird unter dem Gesichtspunkt der Praxis vorgestellt. Diese internen Einzelheiten zu verstehen ist ein großer Schritt zur Meisterschaft im Gebrauch von regulären Ausdrücken.

Kapitel 5, Regex-Methoden aus der Praxis, vertieft das Wissen aus Kapitel 4 anhand einiger Beispiele aus der Praxis. Häufige (aber komplizierte) Probleme werden in allen Einzelheiten beleuchtet.

Kapitel 6, Die Kunst, reguläre Ausdrücke zu schreiben, betrachtet die Auswirkungen von Effizienzüberlegungen anhand praxisnaher Beispiele. Es geht dabei um die Art, wie man in den meisten Programmiersprachen effizientere reguläre Ausdrücke schreiben kann. Das in den Kapitel 4 und Kapitel 5 erworbene Wissen um die innere Funktion der Regex-Maschine wird hier angewendet.

Einzelne Programmiersprachen

Mit dem Wissen aus den Kapitel 4, Kapitel 5 und Kapitel 6 gibt es zu den meisten Implementationen nur noch wenig zu erläutern. Dennoch habe ich für vier verbreitete Programmiersprachen je ein ganzes Kapitel reserviert:

Kapitel 7, Perl, befasst sich sehr genau mit den regulären Ausdrücken in Perl, der wahrscheinlich am stärksten auf reguläre Ausdrücke zugeschnittenen Sprache, die heute benutzt wird. Es gibt zwar nur drei Operatoren, die sich mit regulären Ausdrücken abgeben, diese kennen jedoch eine Vielzahl von Optionen und Spezialfällen, die fast alle Wünsche zur Programmierung mit regulären Ausdrücken befriedigen. Der Reichtum an Möglichkeiten erlaubt es geübten Programmierern, einen Gedanken sehr schnell in ein Programm umzusetzen – er ist aber auch ein veritables Minenfeld für Ungeübte. Das Kapitel räumt einen Weg durch dieses Feld frei.

Kapitel 8, Java, betrachtet das java.util.regex-Paket im Detail. Dieses Paket ist seit Java 1.4 Bestandteil von Java. Das Kapitel behandelt die Version von Java 1.5, es wird aber immer wieder auf Unterschiede zu den Java-Versionen 1.4.2 und 1.6 hingewiesen.

Kapitel 9, .NET, kann man als Dokumentation zu den regulären Ausdrücken in .NET bezeichnen, weil die mitgelieferte Dokumentation von Microsoft den Namen kaum verdient. Ob Sie nun VB.NET, C#, C++, JScript, VBScript, ECMAScript oder irgendeine andere der .NET-Sprachen verwenden: Dieses Kapitel beschreibt die Einzelheiten.

Kapitel 10, PHP, gibt eine kurze Einführung zu den verschiedenen Regex-Maschinen in PHP, befasst sich aber im Weiteren ausschließlich mit der API der preg-Implementation, die ihrerseits die PCRE-Bibliothek benutzt.

Typografische Konventionen

Wenn komplexe Textverarbeitungsprobleme eingehend behandelt werden, ist es wichtig, sich genau auszudrücken. Ein Leerzeichen zuviel oder zuwenig kann einen entscheidenden Unterschied ausmachen. Ich benutze deshalb in diesem Buch folgende Konventionen:

Ein regulärer Ausdrück erscheint normalerweise so. Die feinen Ecken bedeuten »Das ist ein regulärer Ausdrück«. Literaler Text, also Text, der nicht wie eine Variable für etwas anderes steht, erscheint im Allgemeinen ›so‹. Manchmal, wenn keine Verwechslungsgefahr besteht, verzichte ich auch auf die Ecken oder die Anführungszeichen. Programmstücke und Listings werden in ihrer natürlichen Form wiedergegeben, ohne Ecken und Anführungszeichen.

In regulären Ausdrücken und literalem Text verwende ich ein besonderes Auslassungszeichen. Zum Beispiel bezeichnet [...] ein Paar eckiger Klammern mit nicht genau bekanntem Inhalt, aber [...] ist ein Klammerpaar, das drei literale Punkte enthält.

Ohne besondere Vorkehrungen ist es kaum möglich herauszufinden, wie viele Leerzeichen in »a b« vorhanden sind. Wenn Leerzeichen in regulären Ausdrücken oder manchmal auch in literalem Text vorkommen, verwende ich daher das Symbol ›●‹. So ist klar, dass ›a●●●●b‹ exakt vier Leerzeichen enthält.

Ich benutze außerdem »sichtbare« Zeichen für das Tabulatorzeichen, das Newline und das Wagenrücklauf-Zeichen (Carriage Return):

● Ein Leerzeichen Ein Tabulator-Zeichen Ein Newline-Zeichen Ein Wagenrücklauf-Zeichen (Carriage Return)

Ich benutze Unterstreichungen und grau unterlegte Zeichen, um bestimmte Teile von regulären Ausdrücken oder literalem Text hervorzuheben. Zum Beispiel:

Weil ding im Satz ›Dies●bet,●dass●das●Ding●an●sich...‹ eben nicht das Wort ›Ding‹ erkennt, ...

In diesem Fall zeigt der unterstrichene Text den Treffer des regulären Ausdrucks an. Ein anderes Beispiel:

Damit wir Subject|Date wirklich verwenden können, wird es in Klammern eingefasst, und ein Doppelpunkt und ein Leerzeichen werden angefügt: Subject|Date.

Hier zeigen die unterstrichenen Zeichen die Teile an, die eben hinzugefügt worden sind.

Das Buch enthält eine große Menge von Einzelheiten und Beispielen, auf die an anderen Stellen verwiesen wird; das Buch enthält über 1000 Querverweise. Meist wird dafür die Notation »„Punkt oder negierte Zeichenklasse?“« benutzt, die einfach »vgl. „Punkt oder negierte Zeichenklasse?“« bedeutet. Ein Verweis kann beispielsweise so aussehen: »... wie in Tabelle 8-2 aufgeführt („Der Regex-Dialekt von Java“)«.

Übungsaufgaben

Manchmal, und vor allem in den einführenden Kapiteln, stelle ich Aufgaben, um die Wichtigkeit des behandelten Stoffes zu unterstreichen. Die Aufgaben sind nicht bloß Lückenfüller; ich möchte gern, dass Sie sich damit beschäftigen. Damit ihre Funktion nicht verwässert wird, sind es nur wenige im ganzen Buch. Es sind auch Selbsttests: Wenn die Beantwortung länger dauert, sollten Sie sich den entsprechenden Abschnitt noch einmal vornehmen.

Damit Sie sich wirklich etwas zu den Aufgaben überlegen, habe ich die Antworten ein bisschen versteckt. Die Antworten zu einer mit markierten Frage finden Sie auf der jeweils nächsten geraden Seite, Sie müssen also nur das Blatt wenden. So stolpern Sie nicht aus Versehen über die Auflösung, und sie ist dennoch sofort greifbar.

Persönliche Anmerkungen und Dank

Das Schreiben der ersten Auflage war für mich eine mörderische Aufgabe, die zweieinhalb Jahre gedauert hat und nur mit der Hilfe von vielen anderen möglich war. Nachdem ich damit meine körperliche und geistige Gesundheit vorübergehend ruiniert hatte, habe ich mir geschworen, nie wieder so etwas zu tun.

Ich muss vielen Leuten danken, dass sie mir geholfen haben, diesen Schwur zu brechen. Zuallererst meiner Frau, Fumie. Wenn Sie dieses Buch schätzen, liegt es in erster Linie an ihrer Unterstützung und ihrem Verständnis, ohne dies hätte ich die mühsame Arbeit für das Schreiben und die Produktion dieses Buches nicht durchgehalten.

Bei der Recherche für dieses Buch haben mir viele Leute Sprachen und Systeme nähergebracht, die ich zuvor nicht kannte. Noch mehr Leute haben Entwürfe und Fahnen begutachtet und Korrektur gelesen.

Im Besonderen möchte ich meinem Bruder Stephen Friedl für seine peinlich genauen und detaillierten Korrekturen danken (er ist nicht nur ein guter technischer Gutachter, er schreibt auch selbst; z.B. seine »Tech Tips« auf http://www.unixwiz.net/).

Außerdem danke ich Zak Greant, Ian Morse, Philip Hazel, William F. Maton und meinem Lektor, Andy Oram.

Besonderen Dank schulde ich Mike »madbot« McCloskey, Mark Reinhold und Dr. Cliff Click (alle Sun) für die Einblicke in Java. Ich danke David Gutierrez, Kit George und Ryan Byington bei Microsoft für ihre Hilfe mit .NET. Andrei Zmievski von Yahoo! hat mir die Tiefen von PHP nähergebracht.

Ich danke Dr. Ken Lunde bei Adobe Systems, der eigens Zeichen und Schriftsätze für die typografischen Merkwürdigkeiten geschaffen hat. Die japanischen Zeichen stammen aus der Schrift Heisei Mincho W3 von Adobe Systems und die koreanischen Zeichen aus der Schrift Munhwa des koreanischen Ministeriums für Kultur und Sport. Es war Ken, der mir das Leitbild für dieses Buch gegeben hat: »Du machst die Forschungsarbeit, damit deine Leser sie nicht machen müssen.«

Ich danke außerdem Jeffrey Papen und Peak Web Hosting (http://www.PeakWebhosting.com/) für die Hilfe beim Aufsetzen des Servers für http://regex.info.

Kapitel 1. Einführung in reguläre Ausdrücke

Hier ein Szenario: Sie bekommen den Auftrag, alle Seiten auf einem Webserver nach verdoppelten Wörtern zu durchsuchen. Solche Verdopplungen (wie »das das«) entstehen häufig bei Texten, die mehrfach überarbeitet werden. Ihre Aufgabe ist es, eine Lösung zu finden, die

mehrere Dateien überprüft, jede Zeile mit verdoppelten Wörtern herausschreibt, die Verdopplungen (mittels ANSI-Escape-Sequenzen) hervorhebt und bei jeder Zeile den Dateinamen angibt,

auch dann korrekt arbeitet, wenn das eine Wort am Ende einer Zeile und das verdoppelte am Anfang der nächsten Zeile steht,

Groß- und Kleinschreibung wie bei ›Das das ...‹ ignoriert sowie beliebige Mengen von Whitespace (Leerzeichen, Tabulator, Zeilenende usw.) zwischen den Wörtern zulässt und

auch Wörter findet, die durch HTML-Tags (neben Whitespace) getrennt sind. HTML-Tags werden in Webseiten benutzt, um beispielsweise ein Wort fett gedruckt hervorzuheben: ›... das ist <B>sehr</B> sehr wichtig ...‹.

Eine ganz hübsche Liste von Anforderungen! Aber das Problem muss gelöst werden, und es ist ein Problem aus der Praxis. Ich habe ein solches Programm auf eine Version des Manuskripts dieses Buches angewandt und war erstaunt über die Menge der Verdopplungen. Es gibt natürlich viele Programmiersprachen, mit denen sich diese Aufgabe lösen lässt, aber eine, die reguläre Ausdrücke kennt, macht die Lösung entschieden einfacher.

Reguläre Ausdrücke sind ein mächtiges, flexibles und effizientes Mittel, um Texte zu bearbeiten. Reguläre Ausdrücke im engeren Sinne sind eine generelle Notation zur Beschreibung von Textmustern, beinahe wie eine kleine Programmiersprache zum Prüfen und zum Manipulieren von Texten. Mit den zusätzlichen Mitteln eines bestimmten Programmierwerkzeugs können reguläre Ausdrücke benutzt werden, um alle Arten von Text zu erweitern, zu reduzieren und auf jede erdenkliche Art misshandeln. Es kann sich um einfache Dinge handeln wie um die Suchfunktion eines Texteditors oder um komplexe wie eine ganze Textverarbeitungssprache. Dieses Buch zeigt, wie reguläre Ausdrücke produktivitätssteigernd eingesetzt werden können. Es zeigt, wie man in regulären Ausdrücken denkt und so ihr volles Potenzial einsetzen kann.

Ein vollständiges Programm zur Lösung der gestellten Aufgabe kann aus einigen wenigen Zeilen einer modernen Programmiersprache bestehen, die reguläre Ausdrücke kennt. Mit einer einzigen »Suchen und Ersetzen«-Anweisung können verdoppelte Wörter gefunden und hervorgehoben werden. Mit einer weiteren solchen Anweisung werden alle Zeilen weggelassen, die keine Verdopplungen enthalten, so dass nur die interessanten Zeilen übrig bleiben. Mit einer dritten Anweisung wird zu jeder Zeile der Name der Datei ausgegeben, aus der die Zeile stammt. Im nächsten Kapitel finden Sie in Perl und Java ausprogrammierte Beispiele dazu.

Die Programmiersprache (Perl, Java, VB.NET oder was auch immer) stellt das Umfeld bereit, aber die wirkliche Kraft kommt aus den regulären Ausdrücken. Indem Sie mit diesem Potenzial umgehen lernen, werden Sie lernen, reguläre Ausdrücke für Ihre eigenen Zwecke zu verwenden, um Text zu durchsuchen, hervorzuheben und uninteressanten Text wegzulassen. Sie werden Ihre regulären Ausdrücke mit den Konstrukten der Programmiersprache kombinieren und den zu bearbeitenden Text damit manipulieren – ob es sich nun um Escape-Sequenzen oder um das Weglassen oder Ändern von Text handelt.

Probleme aus der Praxis lösen

Wenn Sie mit regulären Ausdrücken umgehen können, stehen Ihnen Lösungsmöglichkeiten offen, die Sie vordem vielleicht gar nicht erahnen konnten. Ich benutze reguläre Ausdrücke jeden Tag mehrfach, um kleine und größere Probleme zu lösen (und oft sind es kleine Probleme, die ohne das Instrument der regulären Ausdrücke zu großen Problemen würden).

Bei einem Beispiel, bei dem die regulären Ausdrücke der Schlüssel zur Lösung eines großen und wichtigen Problems sind, ist der Gewinn offensichtlich. Nicht so offensichtlich ist die Art, wie man mit regulären Ausdrücken viele kleine »uninteressante« Probleme angeht. Mit »uninteressanten« Problemen meine ich solche, deren Lösung sich nicht zum Erzählen von tollen Anekdoten eignet, die aber das Weiterarbeiten unmöglich machen, bis sie gelöst sind. Für mich ist das Einsparen einer Stunde stupider, repetitiver Arbeit schon irgendwie aufregend und damit interessant.

Ein einfaches Beispiel: Bei einer Anzahl von Dateien (genauer: bei den etwa 70 Dateien, aus denen dieses Buch entstand) musste überprüft werden, ob der String ›SetSize‹ genauso oft (oder genauso selten) vorkommt wie ›ResetSize‹. Die Groß- und Kleinschreibung war dabei irrelevant (also zählt ›setSIZE‹ genauso wie ›SetSize‹). 32,000 Zeilen von Hand durchzukämmen kommt natürlich nicht in Frage. Auch die normale »Suche Wort«-Funktion eines Text-Editors ist bei der gegebenen Anzahl von Dateien viel zu umständlich.

Hier waren reguläre Ausdrücke die Helfer in der Not! Mit einer einzigen kurzen Befehlszeile konnte ich alle Dateien durchforsten und bestätigen, was ich überprüfen wollte. Zeitaufwand: vielleicht 15 Sekunden, um den Befehl zu tippen, und weitere 2 Sekunden für die tatsächliche Rechenzeit. Ha! (Wenn Sie an der Lösung interessiert sind, die ich benutzt habe, blättern Sie vor zur „Zu den Beispielen“.)

Ein anderes Beispiel: Vor einiger Zeit half ich einem Freund bei einem Problem im Zusammenhang mit E-Mail auf einer Maschine, die nur über eine langsame Modemleitung zugänglich war. Ich sollte ihm ein Inhaltsverzeichnis aller Meldungen senden – und das waren sehr viele. Auch wenn es nicht so viele Meldungen gewesen wären, wäre das Zusammenstellen der Überschriften eine mühsame und monotone Arbeit gewesen. Außerdem hätte ich dabei den Text der Meldungen gesehen, der mich nun wirklich nichts angeht.

Wiederum bewährten sich reguläre Ausdrücke als Helfer in der Not! Mit einem simplen Befehl (ich benutzte das Suchwerkzeug egrep; vgl. später in diesem Kapitel) konnte ich die From:- und Subject:-Zeilen aus jeder Meldung extrahieren. Um egrep zu instruieren, welche Arten von Zeilen ich sehen wollte (und welche nicht), benutzte ich den regulären Ausdrück ^(From|Subject):.

Als mein Freund diese Liste hatte, fragte er mich nach einer bestimmten (5000 Zeilen langen!) Meldung. Auch hier wäre das Benutzen eines Editors oder eines E-Mail-Programms zum Herausfiltern dieser Meldung eher umständlich gewesen. Ich benutzte ein anderes Werkzeug (dieses Mal sed) und wieder einen regulären Ausdrück, der genau die gesuchte Meldung aus der großen Datei herausnahm. Auf diese Art konnte ich die gewünschte Meldung schnell und einfach abschicken.

Uns beiden Zeit und Mühsal zu sparen, war nicht besonders »interessant«, aber sicher interessanter, als mit einem Text-Editor eine Stunde Zeit zu verschwenden. Hätte ich nichts über reguläre Ausdrücke gewusst, wäre mir aber gar keine Alternative eingefallen. Die Geschichte zeigt, wie man mit regulären Ausdrücken arbeiten kann, um Dinge zu tun, die man sich sonst gar nicht ausdenken könnte.

Wenn Sie gelernt haben, mit regulären Ausdrücken umzugehen, werden Sie erkennen, wie wertvoll sie sind, und Sie werden sich fragen, wie Sie vordem ohne sie ausgekommen sind.[1]

Meisterschaft im Umgang mit regulären Ausdrücken ist eine kaum zu überschätzende Fertigkeit. Dieses Buch liefert die Informationen, um diese Fertigkeit zu erlangen, und ich hoffe, dass es auch die Motivation dafür liefert, dies zu tun.

[1] Wenn Sie einen digitalen Videorecorder mit Festplatte haben, kennen Sie dieses Gefühl!

Reguläre Ausdrücke als Programmiersprache

Wenn Sie noch nie mit regulären Ausdrücken gearbeitet haben, werden Sie den regulären Ausdrück ^(From|Subject): aus dem letzten Beispiel nicht verstehen; aber es ist nichts Magisches daran. Zudem: Es ist nichts Magisches hinter der Magie. Ein Magier tut einfach Dinge, die für die Nicht-Eingeweihten im Publikum unmöglich oder widernatürlich aussehen. Wenn Sie gelernt haben, wie man eine Spielkarte in der Hand hält, so dass es aussieht, als ob die Hand leer wäre, haben Sie »magische Fähigkeiten« – es braucht nur Übung dazu. Es ist wie mit einer Fremdsprache – wenn man die Grundlagen beherrscht, klingt sie nicht mehr wie völlig unverständliche Lautäußerungen.

Die Analogie zu Dateinamen

Wenn Sie sich für den Kauf dieses Buches entschieden haben, haben Sie wahrscheinlich eine Vorstellung davon, was ein »regulären Ausdrück« eigentlich ist. Aber auch, wenn Sie keine solche haben, kennen Sie ziemlich sicher das zugrunde liegende Konzept.

Sie wissen, dass report.txt einen Namen für eine ganz bestimmte Datei darstellt. Wenn Sie auch nur ein klein wenig Erfahrung mit Unix oder DOS/Windows haben, wissen Sie, dass das Muster »*.txt« dazu benutzt wird, um mehrere Dateien auszuwählen. Bei solchen Mustern (Dateiglobs oder Wildcards genannt) gibt es einige wenige Zeichen, die eine spezielle Bedeutung haben. Das Sternchen steht für »irgendwelche Zeichen«, und das Fragezeichen steht für »irgendein Zeichen«. Mit dem Dateiglob »*.txt« beginnen wir mit »irgendwas« * und enden mit dem Literal .txt, also haben wir ein Muster, das aussagt: »Wähle die Dateien, deren Namen mit irgendwas beginnen und mit .txt aufhören.«

Die meisten Systeme kennen noch zusätzliche Spezialzeichen, aber im Allgemeinen ist die Ausdruckskraft solcher Dateiglobs doch recht begrenzt. Das ist kaum von Nachteil, weil auch der Umfang des Problems (eine bequeme Art, Gruppen von Dateien zu bezeichnen) doch recht limitiert ist, auf ordinäre Dateinamen eben.

Die Behandlung von beliebigen Texten ist dagegen ein ungleich komplexeres Problem. Prosa, Poesie, Programm-Listings, Memos, HTML, Artikel, Tabellen, Buchmanuskripte (wie dieses), Wörterlisten; die Aufzählung ist unvollständig. Für eine bestimmte Untergruppe, wie eben das Auswählen von Dateien, lässt sich ohne Weiteres ein spezialisiertes Werkzeug entwickeln.

Über die Jahre hat sich jedoch eine generalisierte Sprache entwickelt, die genügend mächtig und ausdrucksstark für eine große Variationsbreite von Verwendungszwecken ist. Jedes Programm implementiert und benutzt diese Muster in leicht unterschiedlicher Weise, aber alle fallen unter den Begriff »reguläre Ausdrücke«.

Die Analogie zu natürlichen Sprachen

Reguläre Ausdrücke sind aus zwei Typen von Zeichen aufgebaut. Die Spezialzeichen (wie das * aus der Dateinamen-Analogie) heißen Metazeichen, alle anderen Buchstaben sind Literale. Bei regulären Ausdrücken geht die Verwendung von Metazeichen weit über den Bereich von Dateiglobs hinaus. Muster von Dateinamen können mit wenigen Metazeichen behandelt werden, aber die »Programmiersprache« der regulären Ausdrücke erfordert viele und ausdrucksstarke Metazeichen.

Es kann helfen, reguläre Ausdrücke als eigene Sprache zu betrachten, wobei den Literalen die Rolle der Wörter zukommt und den Metazeichen die Rolle der Grammatik. Wörter werden nach den Regeln der Grammatik so kombiniert, dass der resultierende Satz oder Ausdruck einen Sinn ergibt. Im E-Mail-Beispiel habe ich FromSubject: benutzt, um Zeilen zu finden, die mit ›From:‹ oder ›Subject:‹ beginnen. Die Metazeichen sind hier unterstrichen, und wir kommen bald zur Erklärung der Bedeutung dieser Zeichen.

Wie beim Erlernen jeder neuen Sprache fühlt man sich auch bei regulären Ausdrücken zunächst mal etwas ratlos. Darum sehen sie auch wie Magie aus, wenn man nur wenig davon versteht, und wie völliger Buchstabensalat für jemanden, der gar nichts davon versteht. Ganz ähnlich wie ![2] für einen Japanisch-Schüler schnell verständlich ist, wird Ihnen der reguläre Ausdrück

s!<emphasis>([0-9]+(\.[0-9]+){3})</emphasis>!<inet>$1</inet>!

bald kristallklar sein.

Dieses Beispiel kommt aus der Produktion dieses Buches und stammt von meinem Lektor. Ich hatte irrtümlich das Tag <emphasis> benutzt, um Internet-Adressen zu markieren (IP-Adressen bestehen aus Ziffern und Punkten, wie etwa 209.204.146.22). Das Skript benutzt den Substitutionsoperator von Perl mit dem regulären Ausdrück

<emphasis>([0-9]+(\.[0-9]+){3})</emphasis>

um diese falschen Tags durch das korrekte <inet>-Tag zu ersetzen, und lässt dabei andere <emphasis>-Tags so, wie sie sind. Später werden wir genau diese Anwendung im Detail besprechen, damit Sie die entsprechenden Methoden in Ihrer Programmiersprache anwenden können.

Das Ziel dieses Buches

Die Wahrscheinlichkeit, dass Sie jemals <emphasis> durch <inet> ersetzen müssen, ist gering, aber es ist sehr wahrscheinlich, dass das Problem »Ersetze dies durch das« auch bei Ihnen auftritt. Das Ziel dieses Buches ist es nicht, fertige Lösungen für spezifische Probleme zu geben, sondern vielmehr zu zeigen, wie man in regulären Ausdrücken denkt, so dass Sie sie anwenden können, wann immer ein so geartetes Problem auftaucht.

[2] »Reguläre Ausdrücke« sind einfach! Ein humoristischer Kommentar dazu: Wie in Kapitel 3 erklärt, kommt der Terminus regulärer Ausdruck ursprünglich aus der formalen Algebra. Wenn mich jemand fragt, wovon denn das Buch handle, dann ergibt die Antwort »reguläre Ausdrücke« meist fragende Gesichter bei Leuten, die nicht häufig mit Computern umgehen. Das japanische Wort für regulären Ausdrück, , bedeutet auch für den Durchschnittsjapaner ähnlich wenig wie das deutsche Gegenstück, aber von Japanern ernte ich etwas mehr als nur einen verständnislosen Blick. Im Japanischen wird nämlich »regulär« fast genau gleich ausgesprochen wie ein anderes, wesentlich häufigeres Wort, ein medizinischer Ausdruck für »Fortpflanzungsorgane«. Man kann sich ausmalen, was für Vorstellungen dabei geweckt werden ...

Reguläre Ausdrücke als Denkweise

Wie wir bald sehen werden, sind reguläre Ausdrücke aus kleinen Bausteinen aufgebaut. Jeder Baustein ist für sich allein recht einfach, aber weil man diese Bausteine auf unendlich viele Arten zusammensetzen kann, braucht man einige Erfahrung, um zum gewünschten Resultat zu kommen. In diesem Kapitel geht es um einen Überblick über die grundlegenden Begriffe bei regulären Ausdrücken. Nicht mit zu viel Tiefe: Es geht darum, ein Fundament für den Rest des Buches zu legen, auf dem die wichtigen Seitenaspekte aufbauen können, bevor wir uns zu tief in Details verstricken.

Manche Beispiele mögen lächerlich erscheinen (sie sind oft lächerlich), aber sie veranschaulichen die Art von Problemen, die man sehr oft vor sich hat – nur erkennen Sie die Probleme vielleicht noch nicht. Machen Sie sich keine Sorgen, wenn Ihnen nicht gleich der hinterste und letzte Punkt einleuchtet. Nehmen Sie den Grundgedanken jeder Lektion mit, und lassen Sie ihn einwirken. Das ist das Ziel dieses Kapitels.

Wenn Sie Erfahrungen mit regulären Ausdrücken haben

Wenn Ihnen reguläre Ausdrücke schon einigermaßen bekannt sind, bietet Ihnen die Übersicht in diesem Kapitel nicht viel Neues. Mindestens überfliegen sollten Sie es trotzdem. Auch wenn Ihnen die Bedeutung der Metazeichen bekannt ist, kann die Herangehensweise an reguläre Ausdrücke neu sein.

Es ist ein Unterschied, ob Sie einem Instrument Töne entlocken oder ob Sie ein Instrument wirklich spielen können. Genauso gibt es einen Unterschied zwischen dem Verstehen von regulären Ausdrücken und dem wirklichen Verstehen von regulären Ausdrücken. Manche der Schritte in diesem Kapitel präsentieren, was Sie schon kennen, vielleicht aber in einer neuen Art, und die kann der Weg zum wirklichen Verständnis von regulären Ausdrücken sein.

Textdateien durchsuchen: egrep

Textstücke zu suchen, ist die einfachste Anwendung von regulären Ausdrücken – viele Texteditoren und Textverarbeitungssysteme ermöglichen es, ein Dokument nach regulären Ausdrücken zu durchsuchen. egrep ist noch einfacher. Man gibt egrep einen regulären Ausdrück sowie ein paar Namen von Dateien, die durchsucht werden sollen. egrep wendet den regulären Ausdrück auf jede Zeile jeder Datei an und schreibt die Zeilen heraus, für die der reguläre Ausdrück zutrifft. egrep ist ein frei verfügbares Programm für eine Anzahl von Systemen, mindestens für DOS, MacOS, Windows, Unix usw. Auf der Website zu diesem Buch, http://regex.info, wird erklärt, wie Sie egrep für Ihr Betriebssystem erhalten.

Um zum E-Mail-Beispiel zurückzukommen: Der Befehl, mit dem ich das einfache E-Mail-Inhaltsverzeichnis erzeugt habe, ist in Abbildung 1-1 dargestellt. egrep betrachtet das erste Argument als den regulären Ausdrück und alle weiteren Argumente als Datei(en), in denen gesucht werden soll. Beachten Sie, dass die Hochkommas in Abbildung 1-1nicht zum regulären Ausdrück gehören; sie werden von meiner Shell verlangt.[3] Wenn ich egrep benutze, kleide ich den regulären Ausdrück fast ausnahmslos in solche Hochkommas ein. Welche Zeichen Spezialzeichen sind, in welchem Zusammenhang und für wen (für den regulären Ausdruck oder für das verwendete Programm), in welcher Reihenfolge sie ausgewertet werden: Diese Detailfragen werden dann wichtig, wenn reguläre Ausdrücke in einer richtigen Programmiersprache verwendet werden; damit beginnen wir im nächsten Kapitel.

Abbildung 1-1. Aufruf von egrep auf der Kommandozeile

Wir werden die einzelnen Teile dieses regulären Ausdrucks noch genau analysieren, aber es ist wahrscheinlich unmittelbar einleuchtend, dass bestimmte Teile eine besondere Bedeutung haben. In diesem Beispiel sind die Klammern und die Zeichen ^ und | Metazeichen, und zusammen mit den anderen Zeichen ergeben sie das gewünschte Resultat.

Sollte Ihr regulärer Ausdrück keines der Dutzend Metazeichen benutzen, die egrep versteht, dann wird aus dem Befehl eine simple Suche nach Zeichenketten. Wenn zum Beispiel in einer Datei nach ding gesucht wird, gibt egrep alle Zeilen aus, die die vier Zeichen d▪i▪n▪g hintereinander enthalten. Das geschieht auch dann, wenn diese Zeichen in einem Wort wie etwa been enthalten sind.

Auch wenn die Zeile nicht das Wortding enthält, genügt die Sequenz d▪i▪n▪g, damit der reguläre Ausdrück zutrifft. Das ist alles, wonach gesucht wird, und wenn es gefunden wird, gibt egrep die Zeile aus. Der springende Punkt ist der, dass die Suche nach regulären Ausdrücken nicht auf »Wörtern« basiert – egrep kennt wohl Bytes und Zeilen innerhalb von Dateien, weiß aber nicht, was im Deutschen (oder in irgendeiner anderen Sprache) ein Wort, einen Satz, einen Abschnitt oder irgendein höheres Konzept ausmacht.

[3] Die Shell ist der Teil des Systems, der eingegebene Befehle liest und dadurch erforderliche Programme ausführt. Bei der von mir benutzten Shell dienen Hochkommas dazu, Argumente für ein Programm einzuschließen. Der Shell wird damit gesagt, den Inhalt der Argumente nicht anzurühren. Ohne Hochkommas würde die Shell beispielsweise ein *-Zeichen, das als Teil des regulären Ausdrucks gemeint ist, selbst interpretieren, nämlich als Dateiglob, als Teil eines Dateinamens. Dagegen soll der Inhalt der Hochkommas unverändert an egrep übergeben werden, das ihn als regulären Ausdrück interpretieren wird. Windows- und COMMAND.COM-Benutzer verwenden wahrscheinlich mit Vorteil doppelte Anführungszeichen ("Gänsefüßchen") statt Hochkommas.

Metazeichen bei egrep

Wir beginnen mit einigen Metazeichen von egrep, um die Möglichkeiten dieses Werkzeugs auszuloten. Ich werde diese nur kurz mit ein paar Beispielen behandeln; die erschöpfende Beschreibung folgt in späteren Kapiteln.

Typografische Konventionen

Vor Beginn stellen Sie bitte sicher, dass Sie die hier verwendeten typografischen Konventionen kennen („Typografische Konventionen“).

Zeilenanfang und Zeilenende

Wahrscheinlich am einfachsten zu verstehen sind die Metazeichen ^ (Zirkumflex) und $ (Dollar), die für den Anfang bzw. das Ende der zu prüfenden Zeile stehen. Wie wir gesehen haben, findet der reguläre Ausdrück ding die Zeichen d▪i▪n▪g irgendwo auf der Zeile, aber ^ding findet die Zeichen d▪i▪n▪g nur dann, wenn sie am Anfang der Zeile stehen. Analog passt der reguläre Ausdrück ding$ nur am Ende der Zeile, wenn zum Beispiel eine Zeile mit Unding endet. Weil Zirkumflex und Dollar den regulären Ausdrück am Anfang oder am Ende der Zeile festmachen, nennt man sie oder einfach .

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!

Lesen Sie weiter in der vollständigen Ausgabe!