perl_anfänger: reguläre ausdrücke /[\d]{N,M}/

hallo

probiere mich gerade an regulären ausdrücken

folgender code sollte meiner meinung nach folgendes ausgeben:

X quatsch
X999 gefunden
9999 quatsch

es wird aber:

X quatsch
X999 gefunden
9999 gefunden

ausgegeben.... warum??

vielen dank für eure mühe

foreach("X","X999","9999"){
  if(/[\d]{1,2}/){
    print "$_ gefunden\n";
  }
  else{
    print "$_ quatsch\n";
  }
}

  1. Hallo perl_anfänger,

    vielen dank für eure mühe

    foreach("X","X999","9999"){
      if(/[\d]{1,2}/){
        print "$_ gefunden\n";
      }
      else{
        print "$_ quatsch\n";
      }
    }

    Dein RegEx sagt 'ein String, der *an einer beliebigen Stelle*
    ein oder zwei Zahlen enthaelt'. Der erste String enthaelt
    keine Zahl. Der zweite enthaelt sowohl eine als auch zwei
    Zahlen. Der Dritte enthaelt auch sowohl eine als auch zwei
    Zahlen. Der Ausdruck matcht also auf String 2 und 3. Btw.
    brauchst du die Zeichenklasse in diesem Fall nicht.

    /\d{1,2}/

    haette es genau so getan.

    Gruesse,
     CK

    1. Hi CK

      foreach("X","X999","9999"){
        if(/[\d]{1,2}/){
          print "$_ gefunden\n";
        }
        else{
          print "$_ quatsch\n";
        }
      }

      Dein RegEx sagt 'ein String, der *an einer beliebigen Stelle*
      ein oder zwei Zahlen enthaelt'. Der erste String enthaelt
      keine Zahl. Der zweite enthaelt sowohl eine als auch zwei
      Zahlen.

      er enthält aber doch drei zahlen... ich dachte, die zweite zahl würde das maximum anzeigen...
      folgendes wäre u.a. bei /[0-9]{1,2}/ok:
      1
      11
      nicht ok:
      111

      oder verstehe ich da was falsch?

      1. Hallo perl_anfänger,

        er enthält aber doch drei zahlen...

        Na und?

        ich dachte, die zweite zahl würde das maximum anzeigen...

        Ja, aber der RegEx muss nicht auf den kompletten String
        matchen, sondern nur auf einen Teilstring. Wenn er auf den
        kompletten String matchen soll, benutze ^ und $.

        Gruesse,
         CK

        1. Hallo Christian,

          er enthält aber doch drei zahlen...

          Na und?

          Ehm ... und warum enthält er dann doch nur zwei Zahlen?

          ich dachte, die zweite zahl würde das maximum anzeigen...

          Ja, aber der RegEx muss nicht auf den kompletten String
          matchen, sondern nur auf einen Teilstring. Wenn er auf den
          kompletten String matchen soll, benutze ^ und $.

          Cool.
          Jetzt weiss aber echt jeder der das Wort Perl buchstabieren kann, wovon du spichst. Oder?
          Ein klein wenig mehr Erklärung wäre doch echt nicht schlecht.
          Vielleicht sogar der richtige RegEx mit einer Erklärung?
          Wäre doch mal was anderes, oder?

          Grüße
          Thomas, der selbst gerne Perl können würde

          1. Hallo,

            er enthält aber doch drei zahlen...
            Na und?
            Ehm ... und warum enthält er dann doch nur zwei Zahlen?

            Er enthält unter anderm auch zwei Zahlen X[99]9 bzw. X9[99].

            Jetzt weiss aber echt jeder der das Wort Perl buchstabieren kann, wovon du spichst. Oder?
            Ein klein wenig mehr Erklärung wäre doch echt nicht schlecht.
            Vielleicht sogar der richtige RegEx mit einer Erklärung?
            Wäre doch mal was anderes, oder?

            /\d{1,2}/ sagt aus, daß im String _irgendwo_ eine einzelne oder zwei Ziffer hintereinander vorkommen müssen, um ein positives Matching zu erreichen. Wo und ob mehrere vorkommen ist vollkommen egal.

            /^\d{1,2}$/ sagt aus, daß der String nur aus einer oder zwei Zffern bestehen darf. Das ^ steht für String-Anfang und das $ für String-Ende.

            Bei dem Eingangs erwähnten Beispiel gäbe es durchaus mehrere Möglichkeiten, eine gültige Regex zu formulieren. Die verwendete (/\d{1,2}/ ist für das gewünshcte Ergebnis einfach nur zu ungenau. /^X\d{1,2}/, /\D\d{1,2}/, /[1]\d{1,2}/ oder Variantionen wie /^\D+\d{1,2}.$/ wären einige Ausdrücke aber sicherlich nicht alle.

            Wichtig bei der Formulierung einer Regex ist imho, daß man den potentiellen Aufbau des Strings sehr genau kennt.
            ICh schreibe hier einmal einige Klartextformulierungen auf, so wie ich die obigen Ausdrücke interpretieren würde:

            /^X\d{1,2}/: Beginnt mit großem X, gefolgt von einer oder zwei Ziffern, der Rest ist egal

            /\D\d{1,2}/: Beginnt mit einer Nicht-Ziffer, gefolgt von einer oder zwei Ziffern, der Rest ist egal

            /[2]\d{1,2}/: Beginnt mit Großbuchstaben, gefolgt von einer oder zwei Ziffern, der Rest ist egal

            /^\D+\d{1,2}.$/: Beginnt mit nindestens einer Nicht-Ziffer, gefolgt von einer oder zwei Ziffern und einem beliebigen Zeichen.

            Thomas, der selbst gerne Perl können würde

            Das ist zwar kein ausschließliches Perl-Thema, aber vielleicht hilft ja http://www.perldoc.com/perl5.6/pod/perlre.html bzw. http://www.perldoc.com/perl5.6/pod/perlfaq6.html etwas weiter.

            Grüße
              Klaus


            1. A-Z ↩︎

            2. A-Z ↩︎

            1. Hallo,

              er enthält aber doch drei zahlen...
              Na und?
              Ehm ... und warum enthält er dann doch nur zwei Zahlen?

              Er enthält unter anderm auch zwei Zahlen X[99]9 bzw. X9[99].

              Jetzt weiss aber echt jeder der das Wort Perl buchstabieren kann, wovon du spichst. Oder?
              Ein klein wenig mehr Erklärung wäre doch echt nicht schlecht.
              Vielleicht sogar der richtige RegEx mit einer Erklärung?
              Wäre doch mal was anderes, oder?

              /\d{1,2}/ sagt aus, daß im String _irgendwo_ eine einzelne oder zwei Ziffer hintereinander vorkommen müssen, um ein positives Matching zu erreichen. Wo und ob mehrere vorkommen ist vollkommen egal.

              /^\d{1,2}$/ sagt aus, daß der String nur aus einer oder zwei Zffern bestehen darf. Das ^ steht für String-Anfang und das $ für String-Ende.

              Bei dem Eingangs erwähnten Beispiel gäbe es durchaus mehrere Möglichkeiten, eine gültige Regex zu formulieren. Die verwendete (/\d{1,2}/ ist für das gewünshcte Ergebnis einfach nur zu ungenau. /^X\d{1,2}/, /\D\d{1,2}/, /[1]\d{1,2}/ oder Variantionen wie /^\D+\d{1,2}.$/ wären einige Ausdrücke aber sicherlich nicht alle.

              Wichtig bei der Formulierung einer Regex ist imho, daß man den potentiellen Aufbau des Strings sehr genau kennt.
              ICh schreibe hier einmal einige Klartextformulierungen auf, so wie ich die obigen Ausdrücke interpretieren würde:

              /^X\d{1,2}/: Beginnt mit großem X, gefolgt von einer oder zwei Ziffern, der Rest ist egal

              /\D\d{1,2}/: Beginnt mit einer Nicht-Ziffer, gefolgt von einer oder zwei Ziffern, der Rest ist egal

              /[2]\d{1,2}/: Beginnt mit Großbuchstaben, gefolgt von einer oder zwei Ziffern, der Rest ist egal

              /^\D+\d{1,2}.$/: Beginnt mit nindestens einer Nicht-Ziffer, gefolgt von einer oder zwei Ziffern und einem beliebigen Zeichen.

              Thomas, der selbst gerne Perl können würde

              Das ist zwar kein ausschließliches Perl-Thema, aber vielleicht hilft ja http://www.perldoc.com/perl5.6/pod/perlre.html bzw. http://www.perldoc.com/perl5.6/pod/perlfaq6.html etwas weiter.

              Grüße
                Klaus

              hi klaus,

              vielen dank, jetzt habe ich es verstanden
              :)

              gruss


              1. A-Z ↩︎

              2. A-Z ↩︎

            2. Hallo Klaus,

              Auch ich danke dir! :-)

              Grüße
              Thomas