[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