regulärer Ausdruck "invertiert"
Götz Gottwald
- perl
Hallo!
Ich habe schon überall gesucht, aber nicht gefunden, wie ich einen regulären Ausdruck umkehren kann.
Ich möchte gern z.B. alles ausser Zahlen in einem string löschen.
So halt nur umgekehrt.
$daten =~ s/\d//g;
Götz
Hi,
Ich möchte gern z.B. alles ausser Zahlen in einem string löschen.
So halt nur umgekehrt.
$daten =~ s/\d//g;
$daten =~ s/\D//g;
Du möchtest Dich ganz gerne mit
perldoc perlre
beschäftigen, glaube ich... :-)
Cheatah
Hi,
Ich möchte gern z.B. alles ausser Zahlen in einem string löschen.
So halt nur umgekehrt.
$daten =~ s/\d//g;
$daten =~ s/\D//g;
Du möchtest Dich ganz gerne mit
perldoc perlre
beschäftigen, glaube ich... :-)
Cheatah
Danke schonmal, aber das war ein doofes Beispiel mit der Zahl.
Ich möchte eigentlich genau das nicht gelöscht haben
$daten =~ s/\d°C//g;
Götz
Hallo Goetz,
Ich möchte eigentlich genau das nicht gelöscht haben
$daten =~ s/\d°C//g;
Hm - vielleicht so:
$daten =~ s/.*(\d°C).*//g;
$daten = $1;
viele Gruesse
Stefan Muenz
Hallo Goetz,
Ich möchte eigentlich genau das nicht gelöscht haben
$daten =~ s/\d°C//g;
Hm - vielleicht so:
$daten =~ s/.*(\d°C).*//g;
$daten = $1;
viele Gruesse
Stefan Muenz
Super! Vielen Dank
Götz
Moin!
Hm - vielleicht so:
$daten =~ s/.*(\d°C).*//g;
$daten = $1;
Geht das nicht noch einfacher:
$daten =~ s/.*(\d°C).*/$1/e;
Option g fällt mal lieber weg (eine Temperatur pro Zeile sollte reichen, oder), dafür muß Option e dazu, damit das $1 direkt ausgewertet wird.
Sinn: Ersetze den gefundenen Suchausdruck "Viele Zeichen, eine einzelne Zahl, "°C" und dann wieder viele Zeichen durch den Wert der ersten Klammer (da sind die Zahl und "°C" drin).
- Sven Rautenberg
Hi,
dafür muß Option e dazu, damit das $1 direkt ausgewertet wird.
nope, Variablen werden auch so umgesetzt. Wenn Du allerdings Funktionen mit $1 füttern und ausführen willst, ist /e nötig.
Cheatah
Moin!
Hm - vielleicht so:
$daten =~ s/.*(\d°C).*//g;
$daten = $1;
Geht das nicht noch einfacher:
$daten =~ s/.*(\d°C).*/$1/e;
Option g fällt mal lieber weg (eine Temperatur pro Zeile sollte reichen, oder), dafür muß Option e dazu, damit das $1 direkt ausgewertet wird.
Sinn: Ersetze den gefundenen Suchausdruck "Viele Zeichen, eine einzelne Zahl, "°C" und dann wieder viele Zeichen durch den Wert der ersten Klammer (da sind die Zahl und "°C" drin).
- Sven Rautenberg
Ich habe das jetzt so gemacht
$daten =~ s/.*\D(\d*°C)\D.*/$1/g;
Damit ich auch mehrstellige Zahlen bekomme, allerdings weiß ich nicht, warum das nicht mit negativen Zahlen geht, wenn ich das so mache
$daten =~ s/.*\D(-?\d*°C)\D.*/$1/g;
Das sollte doch eigentlich so gehen oder?
Götz
Nochmal Moin!
Ich habe das jetzt so gemacht
$daten =~ s/.*\D(\d*°C)\D.*/$1/g;
Klar, aber das Sternchen steht für "Null oder mehr" Zeichen, also auch für garkeine Zahlen. Plus (+) wäre die richtige Wahl für "eine oder mehrere" Zahlen.
Damit ich auch mehrstellige Zahlen bekomme, allerdings weiß ich nicht, warum das nicht mit negativen Zahlen geht, wenn ich das so mache
$daten =~ s/.*\D(-?\d*°C)\D.*/$1/g;
Das sollte doch eigentlich so gehen oder?
Falsche Falle: "-" ist ein Nicht-Zahlen-Zeichen, paßt also auch auf "\D". Und da du explizit auch null Minuszeichen erlaubst, vorher aber explizit mindestens ein Nicht-Zahl-Zeichen forderst, wird halt das Minuszeichen beim \D gefunden, und für "-?" bleibt dann nur noch "" übrig.
An deiner Stelle würde ich schauen, ob du den Ausdruck nicht noch etwas präziser formulieren kannst. Beispielsweise könnte es ja sein, daß immer Leerzeichen um die Gradzahl herum sind, dann nimm statt "\D" einfach " " als Trenner.
- Sven Rautenberg
hi!
$daten =~ s/.*\D(-?\d*°C)\D.*/$1/g;
Falsche Falle: "-" ist ein Nicht-Zahlen-Zeichen, paßt also auch
auf "\D". Und da du explizit auch null Minuszeichen erlaubst,
vorher aber explizit mindestens ein Nicht-Zahl-Zeichen forderst,
wird halt das Minuszeichen beim \D gefunden, und für "-?" bleibt
dann nur noch "" übrig.
Nein, das ist so nicht richtig. Das Problem liegt vielmehr an dem
gierigen *-Quantifier am Anfang des regulären Ausdrucks, also noch
vor dem \D. Macht man diesen Quantifier nämlich nicht-gierig, indem
man ein ? dahinter setzt, funktioniert es.
Das hängt damit zusammen, dass eben der ".*"-Teilausdruck gierig ist,
der "-?"-Teilausdruck aber nicht. Daher schnappt sich der erste Teil-
ausdruck soviel wie er kann, ohne dass es dem zweiten was ausmacht.
Aber so ganz 100%-ig korrekt ist der obige Ausdruck auch nicht. Der
kann durchaus manchmal fehlerhaft arbeiten. Besser sowas in der Art
verwenden: s/.*?(-?\d+°C).*/$1/g;
bye, Frank!
Hi,
$daten =~ s/.*(\d°C).*//g;
$daten = $1;
($daten) = ($daten =~ /(\d°C)/); # ;-)
Auch zur Verneinung komplexer Expressions steht in perldoc perlre übrigens einiges... es hat dann mit "?!" zu tun. Es bleibt dem geneigten Leser überlassen, die funktionierende RegExp zu basteln :-)
Cheatah