Beispiele mit »Suchen und Ersetzen«

(Auszug aus "Reguläre Ausdrücke" von Jeffrey E. F. Friedl)

Das »Subject«-Beispiel ist sehr einfach und deshalb sieht man kaum, wo sich die einzelnen Ansätze unterscheiden. In diesem Abschnitt betrachten wir ein etwas größeres Beispiel und geben so den einzelnen Implementationen Gelegenheit, die Unterschiede zu zeigen.

Unter Nackten Text in HTML verwandeln: Zusammengesetzt hatten wir mit dem folgenden Perl-Programmstück mittels Suchen und Ersetzen E-Mail-Adressen in »Mailto:«-Links verwandelt:

$text =~ s{
   \b
   # Adresse in $1 abspeichern ...
   (
     \w[-.\w]*                          # Username
     @
     [-\w]+(\.[-\w]+)*\.(com|edu|info)  # Hostname
   )
   \b
}{<a href="mailto:$1">$1</a>}gix;

Der Suchen-und-Ersetzen-Operator von Perl modifiziert den Suchstring direkt, d.h., der Inhalt der Suchstring-Variablen wird beim Ersetzen verändert. In den meisten anderen Sprachen wird das Ersetzen bei einer Kopie des Suchstrings durchgeführt.

Das ist praktisch, wenn man den ursprünglichen Suchstring wieder benötigt, aber es erfordert eine weitere Zuweisung, wenn man mit der gleichen Variablen mit verändertem Inhalt weiterarbeiten will. Beispiele dazu folgen.

Suchen und Ersetzen in Java

Hier folgt das gleiche Beispiel in Java mit dem java.util.regex-Package von Sun:

import java.util.regex.*; // Alle Regex-Klassen einbinden.
    .
    . 
    .
Pattern r = Pattern.compile(
   "\\b                                                             \n"+
   "#  Adresse in $1 abspeichern ...                                \n"+
   "(                                                               \n"+
   "  \\w[-.\\w]*                                 # Username        \n"+
   "  @                                                             \n"+
   "  [-\\w]+(\\.[-\\w]+)*\\.(com|edu|info)       # Hostname        \n"+
   ")                                                               \n"+
   "\\b                                                             \n",
   Pattern.CASE_INSENSITIVE|Pattern.COMMENTS);

Matcher m = r.matcher(text);
text = m.replaceAll("<a href=\"mailto:$(1)\">$(1)</a>");

Beachten Sie, dass jeder Backslash ›\‹ in der Regex im String als ›\\‹ auftritt. Aus ›\\w‹ im literalen String wird so ›\w‹ im regulären Ausdruck. Zum Debuggen kann es hilfreich sein, die Regex mit

System.out.println(r.pattern())

auszugeben; so sieht man die Regex, wie sie bei den Regex-Funktionen ankommt.

Außerdem kann man mit entsprechenden Flags auch in den regulären Ausdrücken von Java Kommentare angeben. Diese reichen vom Kommentarzeichen ›#‹ bis zum nächsten Newline. Ein paar Newlines im obigen Ausdruck sind also unbedingt notwendig.

In Perl benutzt man Modifikatoren wie /g, /i und /x für besondere Optionen (globales Matching, Groß-/Kleinschreibung ignorieren, freie Form), in java.util.regex benutzt man dafür entweder eine besondere Funktion (replaceAll statt replace) oder übergibt die Optionen als Argumente an die Funktion (hier Pattern.CASE_INSENSITIVE und Pattern.COMMENTS).

Suchen und Ersetzen in VB.NET

In VB.NET sieht das wiederum ganz ähnlich aus:

Dim R As Regex = New Regex _
("\b                                                       " & _
 "(?# Adresse in $1 abspeichern ...)                       " & _
 "(                                                        " & _
 "  \w[-.\w]*                           (?# Username )     " & _
 "  @                                                      " & _
 "  [-\w]+(\.[-\w]+)*\.(com|edu|info)   (?# Hostname )     " & _
 ")                                                        " & _
 "\b                                                       ",  _
 RegexOptions.IgnoreCase Or RegexOptions.IgnorePatternWhitespace)

text = R.Replace(text, "<a href=""mailto:${1}"">${1}</a>")

Weil die literalen Strings in VB.NET ziemlich unflexibel sind (sie können sich nicht über mehrere Zeilen erstrecken, und es ist schwierig, ein Newline in einen String einzubauen), ist der Umgang mit längeren regulären Ausdrücken nicht so angenehm wie in anderen Sprachen. Andererseits – gerade weil \‹ in VB.NET kein String-Metazeichen ist, müssen die Backslashes der Regex nicht verdoppelt werden. Dafür ist aber das Anführungszeichen ›"‹ in VB.NET ein String-Metazeichen: Wenn man in einem String ein Anführungszeichen haben will, muss man es verdoppelt eingeben.

Suchen und Ersetzen in PHP

Hier folgt das gleiche Beispiel in PHP:

$text = preg_replace(fl{
                         \b
                         # Adresse in $1 abspeichern...
                         (
                           \w[-.\w]*                          # Username
                           @
                           [-\w]+(\.[-\w]+)*\.(com|edu|info)  # Hostname
                         )
                         \b
                     }ixfl,
                     fl<a href="mailto:$1">$1</a>',           # Ersatztext
                     $text);

Wie in Java und VB.NET muss das Resultat des Suchens und Ersetzens wieder der String-Variablen $text zugewiesen werden, aber abgesehen davon ähnelt dieser Code doch sehr dem Perl-Beispiel.

  

<< zurück vor >>

 

 

 

Tipp der data2type-Redaktion:
Zum Thema Reguläre Ausdrücke bieten wir auch folgende Schulungen zur Vertiefung und professionellen Fortbildung an:
   

Copyright der deutschen Ausgabe © 2008 by O’Reilly Verlag GmbH & Co. KG
Für Ihren privaten Gebrauch dürfen Sie die Online-Version ausdrucken.
Ansonsten unterliegt dieses Kapitel aus dem Buch "Reguläre Ausdrücke" denselben Bestimmungen, wie die gebundene Ausgabe: 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.

O’Reilly Verlag GmbH & Co. KG, Balthasarstr. 81, 50670 Köln