MudGuard: Frage zu RegEx

Beitrag lesen

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.