EMZETT.
Login

Kurz: Perl hat reguläre Ausdrücke direkt in die Sprache eingebaut; fast alle anderen Sprachen und Werkzeuge haben ihre Syntax übernommen (PCRE).

Teil des Kurses Perl

Kapitel 6 von 11 im Kurs Perl. Mit Fortschritt, Quiz und Zertifikat auf der Lernseite.

Die Stärke von Perl

Perl hat reguläre Ausdrücke direkt in die Sprache eingebaut; fast alle anderen Sprachen und Werkzeuge haben ihre Syntax übernommen (PCRE).

OperatorZweck
$s =~ /muster/passt?
$s =~ s/alt/neu/ersetzen
$s =~ tr/a-z/A-Z/Zeichen umwandeln
@treffer = $s =~ /(\d+)/galle Treffer
use strict; use warnings;
my $text = "Mia (mia\@example.com) wohnt in 10115 Berlin, Tom (tom\@test.de) in 20095 Hamburg.";
print "gefunden\n" if $text =~ /Berlin/;
print "ohne Beachtung der Schreibweise\n" if $text =~ /BERLIN/i;
if ($text =~ /(\w+)\@(\w+)\.(\w+)/) {
    print "Nutzer: $1, Domain: $2, Endung: $3\n";
}
my @mails = $text =~ /[\w.]+\@[\w.]+\w/g;
print "Mails: @mails\n";
my @plz = $text =~ /\b(\d{5})\b/g;
print "PLZ: @plz\n";
my $anzahl = () = $text =~ /\d/g;
print "Ziffern: $anzahl\n";
 
(my $kopie = $text) =~ s/\d{5}/#####/g;
print "$kopie\n";
my $neu = $text =~ s/Berlin/Köln/r;          # /r: Kopie statt ändern
print substr($neu, 0, 40), "\n";
 
if ("2025-03-15" =~ /^(?<jahr>\d{4})-(?<monat>\d\d)-(?<tag>\d\d)$/) {
    print "Jahr $+{jahr}, Monat $+{monat}, Tag $+{tag}\n";
}

Ausgabe:

gefunden
ohne Beachtung der Schreibweise
Nutzer: mia, Domain: example, Endung: com
Mails: mia@example.com tom@test.de
PLZ: 10115 20095
Ziffern: 10
Mia (mia@example.com) wohnt in ##### Berlin, Tom (tom@test.de) in ##### Hamburg.
Mia (mia@example.com) wohnt in 10115 Kö
Jahr 2025, Monat 03, Tag 15

Syntax-Überblick

MusterBedeutung
.beliebiges Zeichen (außer Zeilenumbruch)
\d \w \sZiffer, Wortzeichen, Leerraum (Großbuchstabe = Gegenteil)
[abc] [^abc] [a-z]Zeichenklassen
^ $ \bZeilenanfang, -ende, Wortgrenze
* + ? {n,m}Wiederholung (gierig); *? +? nicht gierig
( ) (?: ) (?<name> )Gruppe, nicht erfassend, benannt
a|bAlternative

Modifikatoren: i (Groß/klein egal), g (global), m (^/$ je Zeile), s (. trifft Zeilenumbruch), x (Leerraum und Kommentare erlaubt), e (Ersatz als Ausdruck auswerten), r (Kopie liefern).

use strict; use warnings;
my $s = "preise: 10 euro, 25 euro, 7 euro";
(my $a = $s) =~ s/(\d+)/$1 * 2/ge;                    # /e: Ersatz berechnen
print "$a\n";
(my $b = $s) =~ s/(\w+)/\u$1/;                         # \u: erster Buchstabe groß
print "$b\n";
my $gierig = "<b>fett</b> und <i>kursiv</i>";
my ($g) = $gierig =~ /<(.+)>/;
my ($n) = $gierig =~ /<(.+?)>/;
print "gierig: $g | nicht gierig: $n\n";
 
my $re = qr/(\d+)-(\d+)/;                              # vorkompilierter Ausdruck
for my $z ("3-9", "x", "100-200") {
    if (my ($von, $bis) = $z =~ $re) { print "$z: $von bis $bis\n" } else { print "$z: kein Bereich\n" }
}
 
my $komplex = qr/
    ^ (\d{1,3}) \. (\d{1,3}) \. (\d{1,3}) \. (\d{1,3}) $     # IPv4
/x;
print "IP gültig\n" if "192.168.0.1" =~ $komplex;
 
my $mehr = "eins\nzwei\ndrei";
my @zeilen_anf = $mehr =~ /^(\w)/mg;
print "@zeilen_anf\n";
(my $upper = "hallo welt") =~ tr/a-z/A-Z/;
print "$upper\n";
my $vokale = ($upper =~ tr/AEIOU//);
print "Vokale: $vokale\n";
print join("|", split /\s*,\s*/, "a , b,c ,d"), "\n";
print join("|", "2025-03-15" =~ /(\d+)/g), "\n";

Ausgabe:

preise: 20 euro, 50 euro, 14 euro
Preise: 10 euro, 25 euro, 7 euro
gierig: b>fett</b> und <i>kursiv</i | nicht gierig: b
3-9: 3 bis 9
x: kein Bereich
100-200: 100 bis 200
IP gültig
e z d
HALLO WELT
Vokale: 3
a|b|c|d
2025|03|15

Position und Schleifen über Treffer

use strict; use warnings;
my $text = "a1b22c333";
while ($text =~ /(\d+)/g) {
    printf "Treffer %s an Position %d\n", $1, pos($text) - length($1);
}
print "Vor: $`|Treffer: $&|Nach: $'\n" if "Hallo Welt" =~ /o W/;
my %worte;
$worte{lc $1}++ while "Der der DER Hund" =~ /(\w+)/g;
print join(", ", map { "$_=$worte{$_}" } sort keys %worte), "\n";

Ausgabe:

Treffer 1 an Position 1
Treffer 22 an Position 3
Treffer 333 an Position 6
Vor: Hall|Treffer: o W|Nach: elt
der=3, hund=1

Merke

  • =~ /muster/ prüft, s/// ersetzt, tr/// wandelt Zeichen, qr// kompiliert
  • Klammern fangen Treffer in $1, $2 oder %+ (benannt)
  • Modifikatoren: i g m s x e r
  • Gierig vs. nicht gierig: .+ vs. .+?
  • @x = $s =~ /(...)/g liefert alle Treffer

Übungsaufgabe

Extrahiere aus einem Logtext alle IP-Adressen und zähle, wie oft jede vorkommt.

Quiz zur Selbstkontrolle

Weiter im Kurs

Zurück: Subroutinen

Weiter: Dateien, Verzeichnisse und Ein-/Ausgabe

Alle Kapitel: Perl im Überblick