Hi,
Hallo geehrtes Forum,
seit langem komme ich mal wieder zum Programmieren und sogleich sind sie wieder da, die ungelösten Rätsel aus den Tiefen der RegEx-Maschine:
my $tel = '0 (1 77) / 987 65 43';
$tel =~ s/(\d)[()/- ]+(\d)/$1$2/g;
Das macht:
Finde und merke eine Ziffer
Finde mind. 1 Zeichen aus ()/- und Leerzeichen
Finde und merke 1 Ziffer
Ersetze dieses durch das 1. und 2. gemerkte.
Wiederhole das ganze nach dem Ende der ersten Fundstelle.
Im ersten Durchgang wird
0 (1 gefunden und durch 01 ersetzt, der String sieht jetzt so aus: "01 77) / 987 65 43"
Im zweiten Durchgang wird ab dem Leerzeichen vor 77) weitergesucht.
Da das Leerzeichen keine Ziffer ist, wird ab der 7 probiert. Das ist zwar eine Ziffer, aber das folgende Zeichen keins aus der Zeichenklasse.
Also wird bei der 2. 7 versucht, zu matchen: das führt zum Erfolg: das ist eine Ziffer, danach diverse Zeichen aus der Zeichenklasse, gefolgt von einer Ziffer (der 9).
Das kann ersetzt werden, also sieht der String jetzt so aus: "01 77987 65 43"
Im dritten Durchgang wird ab der 8 gesucht. Da kein Zeichen aus der Klasse folgt, wird's mit der folgenden 7 probiert. Erfolg: das Leerzeichen ist in der Klasse, danach kommt eine Ziffer (die 6).
Ersetzung, String sieht jetzt so aus: "01 7798765 43"
Weiter geht's ab der 5. Die paßt, das folgende Leerzeichen auch, die 4 auch.
Ersetzung, String: "01 779876543".
Weiter geht's ab der 3. Die paßt, aber kein Zeichen mehr übrig ==> Fertig.
Ach ja, wenn es Dir nur darum geht, die Zeichen aus der Klasse aus dem String zu entfernen:
suche nur nach der Zeichenklasse und ersetze sie durch nichts.
cu,
Andreas
--
[Warum nennt sich Andreas hier MudGuard?](http://MudGuard.de/)
[O o ostern ...](http://ostereier.andreas-waechter.de/)
Fachfragen per Mail sind frech, werden ignoriert. Das Forum existiert.