Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]11247[/thread]

RegEx arbeitet nicht wie erwartet

Tags: Ähnliche Threads

Leser: 1


<< >> 10 Einträge, 1 Seite
roli
 2008-02-05 15:09
#105575 #105575
User since
2004-12-31
424 Artikel
BenutzerIn
[default_avatar]
Hi,

irgendwie verstehe ich's nicht wirklich. Ich moechte aus "1,234,567,890.0001" gerne die Kommas entfernen. Also habe ich folgendes gebaut:
Code (perl): (dl )
1
2
3
my $num = "1,234,567,890.0001";
my $new_num =~ s/(\d),(\d\d\d)/$1$2/g;
print "$new_num\n";

Wenn ich das sol laufen lasse erhalte ich "1234,56789.0001". Warum aber ist das Komma zwischen der 4 und der 5 noch da? Wenn ich das "g" im Substitute weglasse arbeitet's wie erwartet, nur das erste Komma ist weg.

Das es noch viele andere Wege zum Glueck gibt ist mir klar, mir geht's hier darum zu verstehen, warum diese drei Zeilen nicht arbeiten wie ich's erwarten wuerde.

Danke
Roland
--
"Steh vorn, während du fragst;
sitzen soll, wer antwortet."
Aus "Die Edda des Snorri Sturluson" "Gylfis Täuschung" Strophe 2
nepos
 2008-02-05 15:24
#105577 #105577
User since
2005-08-17
1420 Artikel
BenutzerIn
[Homepage] [default_avatar]
Code (perl): (dl )
1
2
3
my $num = "1,234,567,890.0001";
$num =~ s/,//g;
print "$num\n";


Viel einfacher oder? :)
Linuxer
 2008-02-05 15:27
#105578 #105578
User since
2006-01-27
3875 Artikel
HausmeisterIn

user image
Code (perl): (dl )
1
2
3
4
my $num = "1,234,567,890.0001";

$num =~ tr/,//d;
print "$num\n";


Noch besser ;o)
meine Beiträge: I.d.R. alle Angaben ohne Gewähr und auf Linux abgestimmt!
Die Sprache heisst Perl, nicht PERL. - Bitte Crossposts als solche kenntlich machen!
roli
 2008-02-05 15:35
#105580 #105580
User since
2004-12-31
424 Artikel
BenutzerIn
[default_avatar]
Hi Ihr 2,

erstmal danke, aber ...
Meine Frage war nicht: "wie koennte ich's sonst noch machen, bzw. wer hat eine Loesung fuer mich", sondern ich moechte verstehen warum mein Regulaerer Ausdruck nicht so arbeitet wie ich's erwarte.
Roland
--
"Steh vorn, während du fragst;
sitzen soll, wer antwortet."
Aus "Die Edda des Snorri Sturluson" "Gylfis Täuschung" Strophe 2
moritz
 2008-02-05 15:40
#105581 #105581
User since
2007-05-11
923 Artikel
HausmeisterIn
[Homepage]
user image
Also die Erklärung besteht aus zwei Teilen:

1) $new_num ist nicht initialisiert ;-)
2) s/../../g lässt keine überlappenden Matches zu.
Die Regex matcht also zuerst "1,234", und kann dann nicht mehr "4,567" matchen, weil die "4" schon zum vorherigen match gehört.
Um keinen Überlapp zu haben kann man sowas machen:
s/(\d),(\d)/$1$2/g;
Oder so:
s/(\d),(?=\d{3})/$1/g;
roli
 2008-02-05 15:55
#105582 #105582
User since
2004-12-31
424 Artikel
BenutzerIn
[default_avatar]
Hi,
moritz+2008-02-05 14:40:14--
Also die Erklärung besteht aus zwei Teilen:

1) $new_num ist nicht initialisiert ;-)

Ist's doch, nur aus "Ergonomiegruenden", was auch nur eine Umschreibung fuer Faulheit ist, habe ich's hier weggelassen ;-}

moritz+2008-02-05 14:40:14--
2) s/../../g lässt keine überlappenden Matches zu.
Die Regex matcht also zuerst "1,234", und kann dann nicht mehr "4,567" matchen, weil die "4" schon zum vorherigen match gehört.

Aha, dann hoffe cih mal das ich mir das fuer die Zukunft merke.

moritz+2008-02-05 14:40:14--
Um keinen Überlapp zu haben kann man sowas machen:
s/(\d),(\d)/$1$2/g;
Oder so:
s/(\d),(?=\d{3})/$1/g;

Variante 2 gefaellt mir besser, bzw. ist naeher an meiner urspruenglichen Loesung.

Danke
Roland
--
"Steh vorn, während du fragst;
sitzen soll, wer antwortet."
Aus "Die Edda des Snorri Sturluson" "Gylfis Täuschung" Strophe 2
Linuxer
 2008-02-05 16:04
#105585 #105585
User since
2006-01-27
3875 Artikel
HausmeisterIn

user image
und trotz allem ist tr/,//d die effizienteste Lösung ;o))

EDIT:
dank moritz: -effektivste +effizienteste
meine Beiträge: I.d.R. alle Angaben ohne Gewähr und auf Linux abgestimmt!
Die Sprache heisst Perl, nicht PERL. - Bitte Crossposts als solche kenntlich machen!
moritz
 2008-02-05 16:29
#105588 #105588
User since
2007-05-11
923 Artikel
HausmeisterIn
[Homepage]
user image
Linuxer verwechselt wohl Effektivität mit Effizienz ;-)
Linuxer
 2008-02-05 16:39
#105590 #105590
User since
2006-01-27
3875 Artikel
HausmeisterIn

user image
Immerhin ist "eff" in beiden enthalten ;o)
Aber du hast recht, gemeint ist die Effizienz.
meine Beiträge: I.d.R. alle Angaben ohne Gewähr und auf Linux abgestimmt!
Die Sprache heisst Perl, nicht PERL. - Bitte Crossposts als solche kenntlich machen!
roli
 2008-02-05 17:01
#105591 #105591
User since
2004-12-31
424 Artikel
BenutzerIn
[default_avatar]
Hi,

das die "tr" Loesung eff... ist bezweifele ich ja nicht, nur hilft sie mir nicht bei dem Verstaendnisproblem, das ich hatte.
Roland
--
"Steh vorn, während du fragst;
sitzen soll, wer antwortet."
Aus "Die Edda des Snorri Sturluson" "Gylfis Täuschung" Strophe 2
<< >> 10 Einträge, 1 Seite



View all threads created 2008-02-05 15:09.