Götz Gottwald: regulärer Ausdruck "invertiert"

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

  1. 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

    1. 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

      1. 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

        1. 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

          1. 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

            1. 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

            2. 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

              1. 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

                1. 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!

        2. 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