[Dresden-pm] Regex

Hans-Dietrich Kirmse hd.kirmse at gmx.de
Do Mär 26 12:16:28 PDT 2009


Hallo Falk,

ich bin leider nur ein Autodidakt und Hobbyprogrammierer und
bekomme das nicht mit reg. Ausdrücken hin. ich würde deshalb zu Funktionen
greifen (müssen).

Falk Herrmann schrieb:
> Hi,
> 
> hat jemand eine Idee zu regulären Ausdrücken um Leerzeichen zu 
> entfernen, welche nur zwischen Zahlen auftreten?
> 
> Bsp.:
> 
> "wort1 12 34 56 wort 2"
> 
> soll zu
> 
> "wort1 123456 wort 2"
> 
> werden.

ich vermute mal, es sollen auch andere Anzahlen von "Zifferngruppen"
auftreten können, also soetwas soll auch korrekt behandelt werden:

"wort1 12 34 56 7 8 wort 2"

soll zu

"wort1 12345678 wort 2"

werden.

unter dieser Annahme würde ich folgendes Konstrukt anwenden:

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

#!/usr/bin/perl
use warnings;
use strict;

my $string = "wort1 12 34 56 7 8 wort 2 4 6 22";

# damit auch eine Zifferngruppe am Ende korrekt erkannt wird, haenge
# ich einfach ein Leerzeichen an
$string .= ' ';

# nun die Substitution
$string =~ s/ ([0-9 ]+) /&myfunc($1)/ge;

# das Ergebnis: "wort1 12345678 wort 24622"
print $string;

######### Ende des Programms #########################


sub myfunc
{
   my $mystring = shift;

   my $ergebnis = '';

   my ($aktuelles_zeichen);

   while (length($mystring) > 0) {
     $aktuelles_zeichen = substr($mystring,0,1);  # das ist das erste Zeichen
     if ($aktuelles_zeichen ne ' ') {             # wenn Ziffer
       $ergebnis .= $aktuelles_zeichen;           # die an $ergebnis anhaengen
     }

     $mystring = substr($mystring,1);             # $mystring kuerzen
   }

   return ' ' . $ergebnis . ' ';

}

__END__


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Geht sicher viel besser, aber sollte erstmal eine Lösung sein (hoffe ich).

Mit freundlichen Grüßen
Hans-Dietrich





Mehr Informationen über die Mailingliste Dresden-pm