Über die Gier von Ausdrücken
- Normalerweise wird versucht, das Teilpattern auf einen möglichst großen Teilstring anzuwenden, ohne das Gesamtpattern scheitern zu lassen. Dieses Verhalten kann durch ein nachgestelltes Fragezeichen so geändert werden, daß das zugehörige Pattern auf einen möglichst kleinen Teilstring angewandt wird.
- Wichtig sind diese Unterscheidungen bei Ersetzungen.
- Bezeichnung: Normalerweise sind Pattern greedy = gierig.
- Es ergeben sich also folgende Variationen:
*?
beliebig oft +?
mindestens einmal ??
0 oder 1 mal {n,m}?
n bis m mal {n,}?
mindestens n mal {n}?
genau n mal - Beispiele:
- Perl:
$prog0 = $prog1 = $prog2 = $prog3 = $prog4 = 'void main() { /* unsinniges Programm, das nichts tut */ int i = 1; /* Zaehler */ String s; /* f. Ausgabe */ s = sprintf(" i = %d",i); /* Zuweisung */ print s; /* Ausgabe */ } ' ; $prog0 =~ s/\/\*.*\*\///; print "0: $prog0"; $prog1 =~ s/\/\*.*\*\///g; print "1: $prog1"; $prog2 =~ s/\/\*.*\*\///gs; print "2: $prog2"; $prog3 =~ s/\/\*.*?\*\///g; print "3: $prog3"; $prog4 =~ s/\/\*.*?\*\///gs; print "4: $prog4";
ergibt:
0: void main() { /* unsinniges Programm, das nichts tut */ int i = 1; s = sprintf(" i = %d",i); /* Zuweisung */ print s; /* Ausgabe */ } 1: void main() { /* unsinniges Programm, das nichts tut */ int i = 1; s = sprintf(" i = %d",i); print s; } 2: void main() { } 3: void main() { /* unsinniges Programm, das nichts tut */ int i = 1; String s; s = sprintf(" i = %d",i); print s; } 4: void main() { int i = 1; String s; s = sprintf(" i = %d",i); print s; }
- PHP:
$prog = <<<EOD void main() { /* unsinniges Programm, das nichts tut */ int i = 1; /* Zaehler */ String s; /* f. Ausgabe */ s = sprintf(" i = %d",i); /* Zuweisung */ print s; /* Ausgabe */ } EOD ; // versuche /* irgendwas */ durch '' zu ersetzen: print "1:" . preg_replace("/\/\*.*\*\//","",$prog); print "2:" . preg_replace("/\/\*.*\*\//s","",$prog); print "3:" . preg_replace("/\/\*.*?\*\//","",$prog); print "4:" . preg_replace("/\/\*.*?\*\//s","",$prog);
ergibt:
1:void main() { /* unsinniges Programm, das nichts tut */ int i = 1; s = sprintf(" i = %d",i); print s; } 2:void main() { } 3:void main() { /* unsinniges Programm, das nichts tut */ int i = 1; String s; s = sprintf(" i = %d",i); print s; } 4:void main() { int i = 1; String s; s = sprintf(" i = %d",i); print s; }
- Perl:
Rechenzentrum Universität Kiel