Regular Expressions Daniel Lutz <danlutz@watz.ch> 12.11.2003 1 Was ist eine Regular Expression? Ausdruck, der ein Textfragment beschreibt Eine Regular Expression passt zu einem Textfragment, wenn das Textfragment der von der Regular Expression definierten Form entspricht. Beispiele: - foo - ^\s*$ - ^((\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3}))$ Text-Beispiel (mit Zeilennummern): 1 Die erste Zeile enthält das Wort foo. 2 3 195.215.35.2 4 Die zweite Zeile ist eine Leerzeile, die Leerzeichen 5 enthalten kann. 6 Die Dritte Zeile ist eine IP-Adresse. 2
Anwendungsbereiche Durchsuchen von Texten, Mails, Logfiles,... (z. B. alle Zeilen finden, die ein bestimmtes Textfragment enthalten) Leistungsstarke Such-Sprache Unterstützt von vielen Tools/Programmiersprachen: grep, lex, sed, Emacs, vi, Delphi, Visual C++, Perl, Tcl, awk, Python, C, Java,... Unter UNIX/Linux sehr weit verbreitet Man kann mit Regular Expressions Textfragmente suchen, aber auch gleich ersetzen (-> automatisches Editieren ) 3 Aufgabenbeispiel 70 Dateien (32'000 Zeilen) müssen durchsucht werden Es muss herausgefunden werden, wie oft das Textfragment \begin{slide} und wie oft \end{slide} vorkommen. Beide Zahlen müssen gleich gross sein. Von Hand machen? - Alle 70 Dateien in Editor laden, Texte suchen und zählen. -> Riesiger Aufwand -> Sehr fehleranfällig Lösung: Regular Expressions und das Tool grep/egrep (und wc -l) 4
Ähnlichkeit mit Wildcards in Dateinamen report.txt *.txt Einzelne Datei Alle Dateien, die die Endung.txt haben * und? sind "Metazeichen" (Platzhalter für andere Zeichen) Regular Expressions sind im Prinzip eine Verallgemeinerung dieses Mechanismus für beliebige Texte (nicht speziell Dateinamen) 5 Aufbau von Regular Expressions Es gibt normale (literale Zeichen) und Metazeichen "virtuelle Zeichen": Anfang einer Zeile, Ende einer Zeile, Anfang eines Wortes, Ende eines Wortes,.... beliebiges Zeichen + mindestens ein Vorkommen des vorigen Zeichens * beliebig viele Vorkommen des vorigen Zeichens? voriges Zeichen ist optional {n} {n,m} ^ genau n Vorkommen des vorigen Zeichens zwischen n und m Vorkommen des vorigen Zeichens Anfang einer Zeile (virtuelles Zeichen) $ Ende einer Zeile (virtuelles Zeichen) 6
Aufbau von Regular Expressions Repetitionszeichen beziehen sich auf das vorige Zeichen (sofern keine Klammern gesetzt sind, siehe unten). Dieses Zeichen kann ein Literal sein oder ein Metazeichen, das ein Platzhalter für ein anderes Zeichen ist (z. B. "."). Sind Klammern gesetzt, enspricht der geklammerte Ausdruck einem Zeichen. Klammern / Alternativen: Regular Expressions können geklammerte Ausdrücke enthalten. Diese Ausdrücke sind geschachtelte Regular Expressions. Mit Hilfe von " " können Alternativen definiert werden. Es muss eine dieser Alternativen zutreffen. Z. B.: (First 1st) bzw. (Fir 1)st ^From Subject Date: vs. ^(From Subject Date): 7 Aufbau von Regular Expressions Character-Klassen: [a-z] [A-Z] [a-za-z] [apz] [-apz] [-a-z] [^a-za-z] beliebiger Kleinbuchstabe beliebiger Grossbuchstabe belebiger Buchstabe (klein oder gross) Buchstabe a, p oder z Bindestrich oder Buchstabe a, p oder z Bindestrich oder beliebiger Kleinbuchstabe Umkehrung: beliebiges Zeichen ausser Buchstaben Eine Character-Klasse steht als Platzhalter für ein einzelnes Zeichen. 8
Aufbau von Regular Expressions Spezielle Zeichen (unterstützt von Perl und evtl. anderen Tools): \s Leerzeichen (Space, Tabulator,...) \S Kein Leerzeichen (anderes Zeichen) \d Ziffer \w Zeichen, das in einem W ort enthalten sein kann \W Zeichen, das nicht in einem W ort enthalten sein kann Diese speziellen Metazeichen sind Platzhalter für ein einzelnes Zeichen. 9 Aufbau von Regular Expressions Metazeichen als Literale: Soll ein Metazeichen als normales Zeichen interpretiert werden, muss es mit einem vorangestellten Backslash geschützt werden: \., \+, \*, \?, \(, \), \[, \], \^, \$,... 10
Unterschiede in verschiedenen Tools Die beschriebene Syntax wird von Perl verwendet. Obwohl die Syntax in den verschienen Tools grundsätzlich ähnlich ist, gibt es einige massgebliche Unterschiede: Einige Tools verwenden die Metazeichen., *,?, +, andere jedoch \., \*, \?, \+ Unterschiedliche Unterstützung verschiedener spezieller Metazeichen (\s, \S, \d, \w, \W, \<, \>, etc.) Es gibt sogar Unterschiede zwischen verschiedenen Implementationen desselben Tools (z. B. sed in Solaris, GNU sed, etc.) W ird also eine Regular Expression für ein bestimmtes Tool beschrieben, muss die vom Tool unterstützte Syntax bekannt sein. Oft arbeitet man aber immer mit demselben Tool (z. B. nur Perl), dann sind diese Unterschiede weniger schlimm. 11 Suchen und Ersetzen Einige Tools ermöglichen, gefundenen Text durch anderen Text zu ersetzen. Dabei können auch nur Teile des gefundenen Textfragments ersetzt werden. W erden in der Regular Expression Klammern verwendet, können die geklammerten Teil-Ausdrücke im Ersetzungstext referenziert werden. Beispiele: sed -e 's/windows/linux/g' windows > linux Alle Vorkommen von "Windows" in der Datei windows durch "Linux" ersetzen und Resultat in Datei linux schreiben (g: alle Vorkommen ersetzen, falls es in einer Zeile mehrere Vorkommen gibt, sonst würde nur jeweils das erste Vorkommen ersetzt) perl -pi -e 's/windows/linux/g' datei Alle Vorkommen von "Windows" in der Datei datei durch "Linux" ersetzen. Die Datei datei wird direkt manipuliert. perl -pi -e 's/((\d{2})\/(\d{2})\/(\d{4}))/$4-$3-$2 ($1)/' datei Amerikanisches Datumsformat ins Australische Datumsformat umwandeln, das ursprüngliche Datum in Klammern dahinter schreiben. 12
Anwendungs-Beispiele Suchen in Texten (Tools grep, egrep) Suchen und Ersetzen in Texten (Tools sed, perl) Suchen/Ersetzen in Editoren (die meisten Editoren unter UNIX/Linux unterstützen Regular Expressions, einige IDEs unter W indows ebenfalls) Überprüfung von Eingabewerten in Programmen (Unterstützung von Regular Expressions durch Programmiersprachen/Bibliotheken) Suchen in mehreren Dateien: find. -type f -exec egrep 'abc.*def' {} /dev/null \; (/dev/null wird angegeben, damit egrep die Dateinamen anzeigt) Kombination von Tool zum Suchen nach Dateien mit Tool zum Suchen in Dateien 13 Fazit Regular Expression bieten einen Mechanismus, mit dem viele Arbeiten sehr einfach, schnell und effizient gelöst werden können Sehr weit verbreitet unter UNIX/Linux, langsam auch Einzug in andere Systeme (IDEs, Java) Man muss das Konzept der Regular Expressions kennen, damit man sie auch anwendet. Dieser Vortrag sollte die Verwendung von Regular Expressions "schmackhaft machen" 14
Buchempfehlung Mastering Regular Expressions, 2nd Edition (Englisch) Jeffrey E. F. Friedl Verlag O'Reilly ISBN 0-596-00289-0 Reguläre Ausdrücke, 2. Auflage (Deutsch) Jeffrey E. F. Friedl (Deutsche Übersetzung: Andreas Karrer) Verlag O'Reilly ISBN 3-89721-349-4 Sehr ausführliche Informationien zu Regular Expressions. Nach dem Studium dieses Buchs sollte man Regular Expressions in allen Situationen anwenden können. 15