Michael: Regulärer Ausdrück: Zahl zwischen 0 und 100 finden

Hallo Allerseits,

weiss jemand wie der Ausdruck lautet um eine Zahl zwischen 0 und 100 im Text zu finden?

Viele Grüße
Michael

  1. #\d{1,3}#

    Hallo Allerseits,

    weiss jemand wie der Ausdruck lautet um eine Zahl zwischen 0 und 100 im Text zu finden?

    Viele Grüße
    Michael

    1. Hi,

      #\d{1,3}#

      Das findet auch Zahlen, die größer als 100 sind.

      cu,
      Andreas

      --
      Warum nennt sich Andreas hier MudGuard?
      Schreinerei Waechter
      Fachfragen per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
  2. Tag Michael.

    weiss jemand wie der Ausdruck lautet um eine Zahl zwischen 0 und 100 im Text zu finden?

    So aus der Kalten:

    $text =~ /(\d{1,3})/;  
    $treffer = $1;
    

    Wenn du alle Zahlen finden willst, sollte dir der Listenkontext helfen:

    @treffer = $text =~ /\d{1,3}/g;  
    print join(";",@treffer);
    

    Das Ergebnis: http://anaboe.net/cgi-bin/test.pl.

    Siechfred

    --
    Everybody's going to the party have a real good time,
    Dancing in the desert blowing up the sunshine.
    1. Hi,

      $text =~ /(\d{1,3})/;

      $treffer = $1;

        
      Gleicher Fehler wie bei Yzerman.  
        
      cu,  
      Andreas
      
      -- 
      [Warum nennt sich Andreas hier MudGuard?](http://www.Mud-Guard.de/)  
      [Schreinerei Waechter](http://www.schreinerei-waechter.de/)  
        
      Fachfragen per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.  
      
      
    2. Tag Michael.

      $text =~ /(\d{1,3})/;

      $treffer = $1;

        
      \*argh\* da habe ich doch glatt die Begrenzung auf 100 übersehen, sorry.  
        
      Siechfred
      
      -- 
      Everybody's going to the party have a real good time,  
      Dancing in the desert blowing up the sunshine.
      
  3. Hi,

    weiss jemand wie der Ausdruck lautet um eine Zahl zwischen 0 und 100 im Text zu finden?

    Da müßtest Du schon genauer spezifizieren.

    Was steht vor/nach den Zahlen im Text?
    Was bedeutet zwischen 0 und 100? Ist das inklusive der 0 und inklusive der 100?
    Oder exklusive 0 und exklusive 100?

    cu,
    Andreas

    --
    Warum nennt sich Andreas hier MudGuard?
    Schreinerei Waechter
    Fachfragen per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
  4. Hallo Michael,

    weiss jemand wie der Ausdruck lautet um eine Zahl zwischen 0 und 100 im Text zu finden?

    Inklusive 100 und 0 und alleinstehend:

    $text =~ /(?<!\d)(100|\d{1,2})(?!\d)/;

    Viele Grüße,
    Christian

    1. Tag Christian.

      $text =~ /(?<!\d)(100|\d{1,2})(?!\d)/;

      Ich werde die Lookbehind-Konstrukte auch noch irgendwann kapieren :-/
      Jedenfalls habe ich die Testseite anhand deines Regulären Ausdrucks geändert, und siehe da, es funktioniert.

      Siechfred

      --
      Everybody's going to the party have a real good time,
      Dancing in the desert blowing up the sunshine.
      1. Hallo Siechfred,

        $text =~ /(?<!\d)(100|\d{1,2})(?!\d)/;

        Ich werde die Lookbehind-Konstrukte auch noch irgendwann kapieren :-/

        So schwer ist das auch nicht:

        (?<!TEXT) ist eine negative lookbehind assertion. Die sorgt dafür, dass _vor_ dem String, der gematcht wird, TEXT *nicht* vorkommen darf. Allerdings matcht (?<!TEXT) nicht auf TEXT, d.h. die Länge der Assertion ist 0 und TEXT ist somit *nicht* Teil des gesamten gematchten Strings.

        /(?<!ASP) ist toll/ findet also die Zeichenkette " ist toll" sofern davor *nicht* "ASP" steht.

        Das Gegenteil davon ist die lookbehind assertion:

        /(?<=Perl) ist toll/ findet die Zeichenkette " ist toll" - aber nur dann, wenn "Perl" davorsteht.

        Genauso gibt es lookahead assertions:

        /Du bist (?!doof)/ findet die Zeichenkette "Du bist " sofern da *nicht* "doof" dahinter steht.

        /Du bist (?=ein Freak)/ findet die Zeichenktte "Du bist " - aber nur dann, wenn "ein Freak" dahinter steht.

        Diese Assertions können auch in anderen Situationen nützlich sein. Du willst bspw. jedes Wort finden, das fünf Buchstaben hat aber *nicht* Linux ist:

        $text =~ /\b(?!Linux)(\w{5})\b/

        (\b ist die Wortgrenze)

        Viele Grüße,
        Christian

        1. Tag Christian.

          /(?<!ASP) ist toll/ findet also die Zeichenkette " ist toll" sofern davor *nicht* "ASP" steht.

          Ja, das Prinzip ist mir schon klar, aber ich verstehe den Sinn von Lookbehind nicht. Das würde man nämlich (in Perl) auch so erreichen: '/(?!ASP) ist toll/'. Wenn ich das Ganze mal teste, funktioniert es:

          # der Satz  
          $text = 'Heute war ich 3mal in 12345 Willihausen, um 25 Brote in der Bäckerei "42", Hauptstraße 101, zu kaufen, doch 0 Chance.';  
            
          # Skalarer Kontext  
          $text =~ /(?=\b)(100|\d{1,2})(?=\b)/;  
          $treffer = $1;  
          # Ausgabe: 25  
            
          # Listenkontext  
          @treffer = $text =~ /(?=\b)(100|\d{1,2})(?=\b)/g;  
          print join(",",@treffer);  
          # Ausgabe: 25,42,0
          

          Wobei es natürlich auf die Vorgabe von Michael ankommt, also ob er allein stehende Zahlen zwischen 0 und 100 oder auch solche Sachen wie '3mal' finden will. Aber wie gesagt, wo ist jetzt der feine Unterschied?

          Siechfred

          --
          Everybody's going to the party have a real good time,
          Dancing in the desert blowing up the sunshine.
          1. Hallo Siechfred,

            /(?<!ASP) ist toll/ findet also die Zeichenkette " ist toll" sofern davor *nicht* "ASP" steht.

            Ja, das Prinzip ist mir schon klar, aber ich verstehe den Sinn von Lookbehind nicht. Das würde man nämlich (in Perl) auch so erreichen: '/(?!ASP) ist toll/'.

            Nein, würde man nicht. Beispiel:

            #!/usr/bin/env perl  
              
            use strict;  
            use warnings;  
              
            my ($text, $match1, $match2);  
              
            $text = "Hallo, ASP ist toll!";  
              
            $match1 = $text =~ /(?!ASP) ist toll/;  
            $match2 = $text =~ /(?<!ASP) ist toll/;  
              
            print "Match 1: " . $match1 . "\n";  
            print "Match 2: " . $match2 . "\n";
            

            Ausgabe:

            Match 1: 1
            Match 2:

            Match 1 matcht den String, weil "(?!ASP) is" *immer* matcht. (" is" ist natürlich nicht das gleiche, wie "ASP") - (?!) ist eben eine Look-AHEAD-Assertion. Du brauchst hier aber eine Look-BEHIND-Assertion - was (?<!) eben leistet - deswegen matcht der 2. Ausdruck nichts. Klar?

            Wenn ich das Ganze mal teste, funktioniert es:

            Ja, weil \b etwas besonderes ist; bei \b ist es Quatsch, das in eine Assertion reinzutun, weil es selbst schon gleichzeitig eine Lookahead/Lookbehind-Assertion ist! (je nach Kontext)

            Viele Grüße,
            CHristian

            1. Tag Christian.

              $match1 = $text =~ /(?!ASP) ist toll/;
              $match2 = $text =~ /(?<!ASP) ist toll/;

              Ah, ich glaube, dass ich langsam dahintersteige. Zum Verständnis:

              Variante 1: "Finde eine Position, an der nicht 'ASP' steht, aber ' ist toll'"
              Variante 2: "Finde eine Position, an der ' ist toll' steht, aber nur dann, wenn davor nicht 'ASP' steht"

              Ist das jetzt so richtig?

              Siechfred

              --
              Everybody's going to the party have a real good time,
              Dancing in the desert blowing up the sunshine.
              1. Hallo Siechfred,

                Variante 1: "Finde eine Position, an der nicht 'ASP' steht, aber ' ist toll'"
                Variante 2: "Finde eine Position, an der ' ist toll' steht, aber nur dann, wenn davor nicht 'ASP' steht"

                Ist das jetzt so richtig?

                Ja.

                Viele Grüße,
                Christian

                1. Tag Christian.

                  Danke für deine Geduld.

                  Siechfred

                  --
                  Everybody's going to the party have a real good time,
                  Dancing in the desert blowing up the sunshine.
                  1. Hallo Siechfred,

                    Danke für deine Geduld.

                    Och, das war doch kein Thema. ;-)

                    Viele Grüße,
                    Christian

    2. $text =~ /(?<!\d)(100|\d{1,2})(?!\d)/;

      Danke Christian! Das wars :-)

      Liebe Grüße
      Michael