Lionstarrs Linux Blog

Ein Blog über Linux und die Welt

Reguläre Ausdrücke 2

Ok, willkommen im zweiten Teil meines Reguläre Ausdrücke Tutorials. Im letzten Teil bin ich auf Zeichenklassen und Wiederholungsoperatoren eingegangen. Hier werde ich auf die Ersetzen Funktion, Einstellungsmöglichkeiten (Flags) und Anwendung regulärer Ausdrücke in der Praxis / in anderen Programmiersprachen eingehen.

Reguläre Ausdrücke sind so an sich zum finden von Text ja ganz schön, aber wenn es ums Ersetzen von bestimmten Text durch einen anderen geht spielen sie ihre wahre macht aus. Um eine Ersetzung mit einem regulären Ausdruck auszulösen muss hinter den Suchausdruck, noch ein Ersatzausdruck geschrieben werden: s/Suchausdruck/Ersatzausdruck/

Als ein Beispiel könnte man einfach mal Mark in Murk verwandeln. Der reguläre Ausdruck dafür lautet:

s/Mark/Murk/

Dieser Ausdruck ist relativ einfach. Aber mit regulären Ausdrücken lassen sich natürlich auch kompliziertere Ersetzungen machen. Ein Beispiel aus der Praxis: In einem Text sollen alle URLs durch einen Link auf sie ersetzt werden. Der reguläre Ausdruck hierfür ist:

s/(http:\/\/(www\.)?[^.]+\.\w{2,4})/<a href=”$1″>$1<\/a>/

Ok, dieser Ausdruck scheint ersteinmal sehr kompliziert zu sein. Aber wenn man ihn Stück nach Stück entschlüsselt ist es gar nicht so schwer. Als erstes die runde Klammer – so was wurde in dem Tutorial noch gar nicht erwähnt. Die runde Klammer speichert das, was der reguläre Ausdruck zwischen den Klammern findet in einem Zwischenspeicher. Der Zwischenspeicher ist eine Variable mit der Nummer der öffnenden Klammer. Das erklärt auch das $1 im Ersatzausdruck. Darauf folgt http:// um URLs zu erkennen. Achtung: Die / müssen mit Backslashes escaped werden, weil sie im regulären Ausdruck eine besondere Bedeutung haben. Jetzt öffnet sich wieder eine runde Klammer die www. (der Punkt musste ja escaped werden) enthält. Das Fragezeichen nach der Klammer bedeutet dass dieser Teil vorkommen darf aber nicht muss: Schließlich kann man URLs mit oder ohne www. schreiben! Als nächstes folgt eine negierte Zeichenklasse die alle Zeichen bis zu dem ersten Punkt verschlingt. Der Punkt folgt nun und die URL-Endung (.de, .info, .com…) muss erkannt werden. Diese Endung kann 2-4 Zeichen enthalten. Im Ersatzausdruck ist eigentlich kein besonderer / unbekannter Operator enthalten. Der Ersatzausdruck ist ein einfacher String in dem Sonderzeichen escaped werden müssen und das einzige besondere (die Variable $1) steht für den Zwischenspeicher der hier eingefügt wird.

Dieser reguläre Ausdruck ersetzt alle URLs mit Links zu ihnen. Schon kann man sich praktische Anwendungen vorstellen: Ein Forum in dem dies sehr viel mehr Bequemlichkeit für die User bedeuten würde…

Um reguläre Ausdrücke besser einzustellen stehen dem gewollten Programmierer ein paar Flags zu Verfügung, die nach dem abschließenden / des Ersatzausdrucks notiert werden sollen. Wenn man i nach dem / notiert dann wird Groß- und Kleinschreibung ignoriert.

Von sich aus ersetzen diese Ausdrücke nur das erste Vorkommen in einem Text, wenn man alle Vorkommen ändern will, muss man das Flag g benutzen.

Um den Code im Ersatzausdruck auszuführen fügt man das Flag e an. Übrigens kann man auch den dann generierten Code ausführen indem man ee schreibt.

Zum nächsten Thema dieses Tutorials: Die Verwendung von regulären Ausdrücken in Programmiersprachen.In Perl sind reguläre Ausdrücke so fest integriert, dass es sogar einen einfachen Operator gibt um reguläre Ausdrücke zu verwenden:=~. Hier ein kleines Programm welches Zeilen von der Eingabe ließt uns sagt ob diese zu einem regulären Ausdruck passen:

Regulärer Tester

  1. #!/usr/bin/perl

  2. while(<>){

  3. chomp;

  4. if(s/(http://(www.)?[^.]+.w{2,4})/<a href="$1">$1</a>/){

  5. print "Treffer: |$`<$&>$`|n";

  6. print "Ersatz: $_n";

  7. }

  8. else{

  9. print "Kein Treffer!n";

  10. }

  11. }

Der reguläre Ausdruck muss natürlich zu dem zu überprüfenden geändert werden.

In PHP gibt es die zwei Funktionen preg_match und preg_replace mit denen mann reguläre Ausdrücke verwenden kann. Doch Achtung: Die Funktion preg_replace ersetzt jedes Vorkommen und nicht nur das erste durch den Ersatzausdruck, wenn man nicht das letzte Argument (limit) anwendet.

preg_match(string regular_expression, string str)

preg_replace(mixed regular_expression, mixed replace_with, mixed subject, [int limit])

Ein paar praktische reguläre Ausdrücke:

http:\/\/(www\.)?[^.]+\.\w{2,4})/<a href=”$1″>$1<\/a>/

Mehr werde ich hinzfuegen.

In: , ,
— January 21, 2007


Kommentare

(verstecken)
      RSS
  1. marco

    October 9, 2009 @03:10:57

    Das ist grossartig! :D Mal gucken ob das auch mit Sed zusammenarbeitet. :P

Gib deine Meinung ab!


(notwendig)






Stoppt die Vorratsdatenspeicherung! Jetzt klicken & handeln!Willst du auch bei der Aktion teilnehmen? Hier findest du alle relevanten Infos und Materialien: