DocSky: Probleme mit regulärem Ausdruck

0 45

Probleme mit regulärem Ausdruck

DocSky
  • php
  1. 0
    Melvin Cowznofski
    1. 0
      dedlfix
      1. 0
        Melvin Cowznofski
        1. 1
          Gunnar Bittersmann
          1. 0
            Christian Kruse
          2. 0
            dedlfix
          3. 0

            regexp: \d != [0-9]

            seth
            • programmiertechnik
      2. 0
        dedlfix
        1. 0
          Melvin Cowznofski
          1. 0
            Gunnar Bittersmann
            1. 0
              Melvin Cowznofski
              1. 0
                Matthias Apsel
                1. 0
                  Melvin Cowznofski
                  1. 0

                    Noch immer keine Lösung?

                    Melvin Cowznofski
                    1. 0
                      dedlfix
                      1. 0
                        Melvin Cowznofski
                        1. 0
                          dedlfix
                          1. 0
                            Melvin Cowznofski
                            1. 0
                              dedlfix
                              1. 0
                                Melvin Cowznofski
                                1. 0
                                  dedlfix
                                  1. 0
                                    Melvin Cowznofski
                                    1. 0
                                      dedlfix
                                      1. 0

                                        Frage nun beantwortet!

                                        Melvin Cowznofski
                    2. 0
                      Gunnar Bittersmann
                      1. 0
                        Melvin Cowznofski
                        1. 0
                          dedlfix
                        2. 0
                          misterunknown
                2. 0
                  dedlfix
                  1. 0

                    Postleitzahlen

                    Matthias Apsel
                    • sonstiges
                    1. 0
                      Tobias Hahner
                      1. 0
                        Matthias Apsel
                        1. 0
                          Tobias Hahner
                          1. 0
                            Matthias Apsel
                            1. 0
                              Tobias Hahner
                            2. 0
                              Der Martin
              2. 0
                Gunnar Bittersmann
    2. 0
      Gunnar Bittersmann
      1. 0
        Melvin Cowznofski
      2. 0
        DocSky
    3. 0
      DocSky
      1. 0
        Gunnar Bittersmann
      2. 0
        dedlfix
  2. 0

    5- bis 10-stellige zahl in string matchen

    seth

Hallo Leute,

ich hardere mal wieder mit meinen regulären Ausdrucken, irgendwie wollen die nicht wie ich.

Ich möchte aus folgenden Strings das vorkommen einer Zahl prüfen, wie:
"der Text ist doof 12345678"
"Probetext 1234567890"
"1234567"
"Noch mehr 123456789 Text kommt nicht"

ich habe das mit folgender Funktion probiert:

  
if (preg_match("/^[0-9]{5,10}$/", $text))  
 echo "Zahl ist drin!";  

Das funzt aber nicht. :'(
Also {5,10} steht drin, da die Zahl mindestens 5 Stellen, maximal aber 10 nicht überschreiten soll.
Was ist jetzt falsch bzw. wie lautet es richtig?

Vielen lieben Dank und Gruß
Doc

  1. Hallo DocSky!

    if (preg_match("/[1]{5,10}$/", $text))
    echo "Zahl ist drin!";

    Das ist eine falsche PHP Syntax!
    Das, was bei Zutreffen der Bedingung passieren soll, steht in geschwungenen Klammern!

    Aber nun zu Deinem regulären Ausdruck:

    Dein Ausdruck sagt: Eine Zahl aus 5-10 Ziffern, weder davor noch danach darf etwas stehen.

    Du willst aber, dass auch davor oder danach etwas stehen darf. Also ein _beliebiges Zeichen_ (dafür steht der Punkt) darf _kein_ Mal oder beliebig oft (dafür steht der Stern) vorkommen. Deshalb:

      
    if ( preg_match('~^.*[0-9]{5,10}.*$~', $text) )  
      
            {  
      
                // ....  
      
            }  
      
    
    

    Mit lieben Grüßen

    Melvin Cowznofski

    --

    Melvin Cowznofski
    What – me worry?

    1. 0-9 ↩︎

    1. Tach!

      if (preg_match("/[1]{5,10}$/", $text))
      echo "Zahl ist drin!";

      Das ist eine falsche PHP Syntax!
      Das, was bei Zutreffen der Bedingung passieren soll, steht in geschwungenen Klammern!

      Nein, wenn nur eine Anweisung folgt, braucht es keine geschweiften Klammern.

      Dein Ausdruck sagt: Eine Zahl aus 5-10 Ziffern, weder davor noch danach darf etwas stehen.

      Etwas genauer gesagt, nach dem Anfang sollen die 5 bis 10 Ziffern folgen und danach das Ende.

      Du willst aber, dass auch davor oder danach etwas stehen darf. Also ein _beliebiges Zeichen_ (dafür steht der Punkt) darf _kein_ Mal oder beliebig oft (dafür steht der Stern) vorkommen. Deshalb:
      if ( preg_match('~^.*[0-9]{5,10}.*$~', $text) )

      Es reicht auch, im Originalausdruck einfach das ^ und $ wegzulassen. (Und [0-9] könnte man noch zu \d abkürzen.)

      dedlfix.


      1. 0-9 ↩︎

      1. Hallo Dedlfix!

        Das, was bei Zutreffen der Bedingung passieren soll, steht in geschwungenen Klammern!
        Nein, wenn nur eine Anweisung folgt, braucht es keine geschweiften Klammern.

        Da hast Du natürlich Recht. Ich bin allerdings davon ausgegangen, dass der OP nach der Regexüberprüfung bei einem Treffer mehr und sinnvolleren Code hat als ein echo "Zahl ist drin!" und das hier nur als Beispiel stand.

        Es reicht auch, im Originalausdruck einfach das ^ und $ wegzulassen. (Und [0-9] könnte man noch zu \d abkürzen.)

        Natürlich, aber ich denke, dass es besonders bei Leuten, die eher selten damit zu tun haben (wo ich übrigens auch dazu gehöre!) beim ersten Blick, besonders in einem komplizierteren Ausdruck, ein [0-9] schneller und leichter gesehen, verstanden und geistig verarbeitet wird als ein \d, wenn es auch technisch das selbe Resultat bringt.

        Es reicht auch, im Originalausdruck einfach das ^ und $ wegzulassen.

        Wenn ich das "an dieser Stelle ist der Anfang" und "hier ist das Ende" direkt vor mir habe, ist mir viel bewußter, dass sich die Definition unmittelbar danch/davor auf den Anfang/das Ende des Ausdrucks bezieht. _Mir persönlich_ passieren dadurch weniger Fehler, deshalb habe ich ^ und $ meistens dabei, auch wenn es technisch nicht erforderlich ist.

        Mit lieben Grüßen

        Melvin Cowznofski

        --

        Melvin Cowznofski
        What – me worry?
        1. @@Melvin Cowznofski:

          nuqneH

          (Und [0-9] könnte man noch zu \d abkürzen.)

          Nicht unbedingt. Hängt von der Sprache ab.

          wenn es auch technisch das selbe Resultat bringt.

          In PHP vielleicht. PHP ist dumm.

          Ansonsten: Mitnichten. \d steht für eine Ziffer, und Ziffern sind weitaus mehr Zeichen als [0-9], bspw. [٠١٢٣٤٥٦٧٨٩].

          S.a. dieses und jenes.

          Qapla'

          --
          „Talente finden Lösungen, Genies entdecken Probleme.“ (Hans Krailsheimer)
          1. Moin Gunnar,

            (Und [0-9] könnte man noch zu \d abkürzen.)

            Nicht unbedingt. Hängt von der Sprache ab.

            Eher von der Regex-Engine.

            wenn es auch technisch das selbe Resultat bringt.

            In PHP vielleicht. PHP ist dumm.

            Das hat mit PHP nichts zu tun, sondern damit, dass sie Perl-Regexe verwenden (tatsächlich sogar den Perl-Code, auch wenn er inzwischen modifiziert ist). Es gibt auch Oniguruma-Bindings für PHP, wo sich dann die Ausdrücke entsprechend anders verhalten.

            Ansonsten: Mitnichten. \d steht für eine Ziffer, […]

            D'Accord.

            LG,
             CK

          2. Tach!

            (Und [0-9] könnte man noch zu \d abkürzen.)
            Nicht unbedingt. Hängt von der Sprache ab.

            Gesucht ist eine Lösung für PHP und keine universelle, also passt das.

            Ansonsten: Mitnichten. \d steht für eine Ziffer, und Ziffern sind weitaus mehr Zeichen als [0-9], bspw. [٠١٢٣٤٥٦٧٨٩].

            Ja und? Rein praktisch dürft das vermutlich keine Rolle spielen (sprich: in den Daten des OP). Außerdem haben wir den UTF-8-Modifizierer u nicht angegeben, also findet \d nur die ASCII-Ziffern.

            S.a. dieses und jenes.

            Beziehe sich auf Python und C#/.NET - hier nicht besonders relevant.

            dedlfix.

          3. gudn tach!

            Ansonsten: Mitnichten. \d steht für eine Ziffer, und Ziffern sind weitaus mehr Zeichen als [0-9], bspw. [٠١٢٣٤٥٦٧٨٩].

            ach du liebe zeit! das war mir neu. und ploetzlich rasen wirre endzeit-szenarien durch meinen kopf, in denen user-eingaben, die damit auf zahl-sein ueberprueft wurden, in arithmetischen ausdruecken verwendet werden und dann aber doch nur als 0 evaluiert werden oder zu abstuerzen oder noch schlimmerem fuehren...

            oha, und perldoc perlre bestaetigt das sogar: "For example, BENGALI DIGIT FOUR (U+09EA) looks very much like an ASCII DIGIT EIGHT (U+0038). And, \d+ , may match strings of digits that are a mixture from different writing systems, creating a security issue."

            gluecklicherweise gibt's abhilfe: "num() in Unicode::UCD can be used to sort this out. Or the /a modifier can be used to force \d to match just the ASCII 0 through 9." (ebd.)

            man muss das eben "nur" _wissen_...

            prost
            seth

      2. Tach!

        Du willst aber, dass auch davor oder danach etwas stehen darf. Also ein _beliebiges Zeichen_ (dafür steht der Punkt) darf _kein_ Mal oder beliebig oft (dafür steht der Stern) vorkommen. Deshalb:
        if ( preg_match('~^.*[0-9]{5,10}.*$~', $text) )

        Es reicht auch, im Originalausdruck einfach das ^ und $ wegzulassen. (Und [0-9] könnte man noch zu \d abkürzen.)

        Achja, die Begrenzung auf maximal 10 hab ich übersehen. \D* steht für alles was keine Ziffer ist und davon beliebig viele (auch keine). Das nach dem ^ und vor dem $ scheiben, sollte es tun.

        dedlfix.

        1. Hallo dedlfix!

          Achja, die Begrenzung auf maximal 10 hab ich übersehen. \D* steht für alles was keine Ziffer ist und davon beliebig viele (auch keine). Das nach dem ^ und vor dem $ scheiben, sollte es tun.

          Gleicher Gedanke. Jetzt warst Du schneller als ich ... wollte mich gerade mit dem "\D" korrigieren, nachdem mich Gunnar auf meinen Denkfehler aufmerksam gemacht hat.

          Wir einigen uns also auf:

          if ( preg_match('~^\D*[0-9]{5,10}\D*$~', $text) )  
            
                  {  
            
                      // ...  
            
                  }  
          
          

          Mit lieben Grüßen

          Melvin Cowznofski

          --

          Melvin Cowznofski
          What – me worry?
          1. @@Melvin Cowznofski:

            nuqneH

            Wir einigen uns also auf:
            if ( preg_match('~^\D*[0-9]{5,10}\D*$~', $text) )

            Nein, darauf kann ich mich nicht einigen. Der Ausdruck erkennt die "42" in "123456789012 foo 42" nicht.

            Qapla'

            --
            „Talente finden Lösungen, Genies entdecken Probleme.“ (Hans Krailsheimer)
            1. Hallo Gunnar!

              Nein, darauf kann ich mich nicht einigen. Der Ausdruck erkennt die "42" in "123456789012 foo 42" nicht.

              Natürlich nicht! Das ist ja auch der Sinn und Zweck dieses regulären Ausdrucks. Der OP hat geschrieben:

              da die Zahl mindestens 5 Stellen, maximal aber 10 nicht überschreiten soll

              Und 42 hat nur 2 Stellen. Ich hab's grad nochmal durchgezählt!

              Mit lieben Grüßen

              Melvin Cowznofski

              --

              Melvin Cowznofski
              What – me worry?
              1. Om nah hoo pez nyeetz, Melvin Cowznofski!

                Nein, darauf kann ich mich nicht einigen. Der Ausdruck erkennt die "42" in "123456789012 foo 42" nicht.

                Natürlich nicht! Das ist ja auch der Sinn und Zweck dieses regulären Ausdrucks. Der OP hat geschrieben:

                da die Zahl mindestens 5 Stellen, maximal aber 10 nicht überschreiten soll

                Aber er erkennt auch nicht meine PLZ in dem Ausdruck "Meine Telefonnummer lautet 123451234512345 und meine Postleitzahl 12345."

                Matthias

                --
                Der Unterschied zwischen Java und JavaScript ist größer als der zwischen Phi und Philosoph.

                1. Hallo Matthias!

                  Aber er erkennt auch nicht meine PLZ in dem Ausdruck "Meine Telefonnummer lautet 123451234512345 und meine Postleitzahl 12345."

                  Tatsächlich! Das zeigt mir wieder, wieso ich dieses Thema so hasse. Nun bin ich mit meinem Latein am Ende. Wie würdest Du den Ausdruck formulieren?

                  Mit lieben Grüßen

                  Melvin Cowznofski

                  --

                  Melvin Cowznofski
                  What – me worry?
                  1. Hallo!

                    Auch, wenn das Thema den OP offenbar nicht mehr interessiert, würde ich trotzdem gerne eine Lösung sehen. Bis dato wurde zwar bei jedem Vorschlag gezeigt, dass er nicht funktioniert, aber einen funktionierenden regulärten Ausdruck hat noch niemand gepostet.

                    Also mit welcher REGEX trifft man in einem String eine Zahl aus mindestens 5 und höchstens 10 Stellen?

                    Meine Überlegungen und bisherigen Versuche:

                    Der Ausdruck muss auf jeden Fall mit ~d{5,10} beginnen und nicht mit ~^d{5,10}, weil die Zahl ja nicht zwingend gleich zu Beginn des zu untersuchenden Strings stehen muss. Das Problem ist das Ende der Zahl, also die letzte Ziffer.

                    Wenn die Zahl nicht mehr als 10 Ziffern haben soll, bedeutet das: Nach der letzten Ziffer kommt entweder irgend ein Zeichen ausser einer Ziffer, ein Leerzeichen oder _nichts_, weil der String zu Ende ist. Und genau hier stecke ich seit Tagen fest. Ich scheitere ja sogar schon am Weg zur Lösung bei den primitivsten Versuchen.

                    ~d{5,10}\D~ zB. bedeutet für mich: Eine Zahl aus mindestens 5 und maximal 10 Ziffern, gefolgt von einer Nichtziffer. Also müsste der String '123456a' ein Treffer sein. Ist er aber nicht!

                    Ich bitte um Hilfe!

                    Mit lieben Grüßen

                    Melvin Cowznofski

                    --

                    Melvin Cowznofski
                    What – me worry?
                    1. Tach!

                      Also mit welcher REGEX trifft man in einem String eine Zahl aus mindestens 5 und höchstens 10 Stellen?

                      Das wurde doch beantwortet. Nicht geklärt werden konnte die Frage, ob das Muster mehrfach auftreten darf oder nur einmal. Aber ich meine, für beide Fälle Lösungen gesehen zu haben.

                      Meine Überlegungen und bisherigen Versuche:

                      Der Ausdruck muss auf jeden Fall mit ~d{5,10} beginnen und nicht mit ~^d{5,10}, weil die Zahl ja nicht zwingend gleich zu Beginn des zu untersuchenden Strings stehen muss. Das Problem ist das Ende der Zahl, also die letzte Ziffer.

                      Du darfst den Anfang nicht unterschlagen, denn 5 bis 10 Ziffern können auch nach beliebig vielen anderen Ziffern folgen.

                      Wenn die Zahl nicht mehr als 10 Ziffern haben soll, bedeutet das: Nach der letzten Ziffer kommt entweder irgend ein Zeichen ausser einer Ziffer, ein Leerzeichen oder _nichts_, weil der String zu Ende ist.

                      Und davor ebenfalls.

                      ~d{5,10}\D~ zB. bedeutet für mich: Eine Zahl aus mindestens 5 und maximal 10 Ziffern, gefolgt von einer Nichtziffer. Also müsste der String '123456a' ein Treffer sein. Ist er aber nicht!

                      d vs. \d

                      dedlfix.

                      1. Hallo dedlfix!

                        Das wurde doch beantwortet.

                        Nein, wo?

                        Der Ausdruck muss auf jeden Fall mit ~d{5,10} beginnen und nicht mit ~^d{5,10}, weil die Zahl ja nicht zwingend gleich zu Beginn des zu untersuchenden Strings stehen muss. Das Problem ist das Ende der Zahl, also die letzte Ziffer.
                        Du darfst den Anfang nicht unterschlagen, denn 5 bis 10 Ziffern können auch nach beliebig vielen anderen Ziffern folgen.

                        Das fand ich zuerst unlogisch! Wenn direkt vor zB. 254 die Ziffern 85 stehen, dann ist die Zahl ja sowieso nicht mehr 254 sondern 85254. Das ändert ja nichts daran, dass im Suchstring eine Aufeinanderfolge von Ziffern mindestens aus 5 und höchstens aus 10 Ziffern bestehen soll, wenn es zu einem Treffer kommt. Und der Anfang einer Zahl ist die erste Ziffer. Wenn davor "beliebig vielen anderen Ziffern" sind, dann ist es ja nicht mehr der Anfang.

                        Aber jetzt dürfte mir der Knopf aufgegangen sein und ich glaube, ich erkenne meinen Denkfehler. Die REGEX wird ja wie eine Schablone "über den Suchstring gelegt" und dann Zeichen für Zeichen nach rechts geschoben. Deshalb muss natürlich bei 5-10 Ziffern auch _davor_ ein Nicht-Ziffernzeichen sein, weil 991111112345a entspricht nicht dem Suchschema, aber bei 1111112345 würde die Regex-Schablone "greifen" und es gäbe fälschlicherweise einen Treffer, wenn man nicht definiert, dass auch davor ein Nicht-Ziffern-zeichen stehen muss. Sehe ich das soweit richtig?

                        d vs. \d

                        Oje, das war ein Copy & Paste Fehler. Natürlich soll das \d und nicht d heißen. Und somit ergibt '~\d{5,10}\D~' für '12345a' auch einen Treffer.

                        OK, für das Ursprungsproblem sehe ich trotzdem keine Lösung. Einer meiner erfolgreichsten Fehlversuche ist immer noch das '~\D\d{5,10}\D~'. Das funktioniert aber nur, so lange der Treffer nicht ganz zu Beginn oder ganz zum Schluss des Suchstrings steht. In diesen beiden Fällen zeigt er nämlich keinen Treffer an. Das heißt, es müsste sowas sein wie ein '\D oder Beginn' sowie ein \D oder Ende' vor und hinter dem d{5,10}. Nur wie definiert man das? Ich finde nichts im Internet und auch nichts in jenem Tutorial, in dem ich immer nachsehe, wenn es um dieses Thema geht.

                        Mit lieben Grüßen

                        Melvin Cowznofski

                        --

                        Melvin Cowznofski
                        What – me worry?
                        1. Tach!

                          Aber jetzt dürfte mir der Knopf aufgegangen sein und ich glaube, ich erkenne meinen Denkfehler. Die REGEX wird ja wie eine Schablone "über den Suchstring gelegt" und dann Zeichen für Zeichen nach rechts geschoben. Deshalb muss natürlich bei 5-10 Ziffern auch _davor_ ein Nicht-Ziffernzeichen sein, weil 991111112345a entspricht nicht dem Suchschema, aber bei 1111112345 würde die Regex-Schablone "greifen" und es gäbe fälschlicherweise einen Treffer, wenn man nicht definiert, dass auch davor ein Nicht-Ziffern-zeichen stehen muss. Sehe ich das soweit richtig?

                          Genau. Ein x{min,max} sagt nichts darüber aus, was vorher oder nachher stehen darf oder auch nicht. Es schnappt sich einfach gierig (falls kein U-Modifizierer verwendet wurde) den nächstbesten passenden Teilstring.

                          dedlfix.

                          1. Hallo dedlfix!

                            Im Zusammenhang mit Gruppierungsklammern () ergibt ?: eine non-capturing Gruppe, sie taucht dann nicht unter den Matches auf. Das ist im PHP-Perl-Regexp-Kapitel beschrieben.

                            Ich habe mich die letzten 3 Tage immer wieder mit dem Thema auseinandergesetzt und versucht, die Sache zumindest _irgendwie_ zu verstehen, aber was immer ich auch lese ... ich verstehe _nichts_. Mir ist die ganze Sache so schleierhaft, dass ich mir jetzt auch sehr schwer tue, eine Frage zu formulieren oder wirklich exakt zu beschreiben, was jetzt genau die Unklarheit ist.

                            In dem von mir schon verlinkten REGEX Tutorial habe ich sogar auf der Seite Zeichen gruppieren durch Unterausdrücke eine Erklärung zu dem ominösen "?:" gefunden. Ebenso wie verschiedene andere Erklärungen auf Englisch, wie zB. BackReferences in Regular Expression. Und natürlich fand ich auch im php-Manual die Seite Subpatterns, wo das "?:" erwähnt wird.

                            Einer der vielen Unklarheiten für mich ist zB. Folgendes aus dem php Manual:

                            There are often times when a grouping subpattern is required without a capturing requirement. If an opening parenthesis is followed by "?:", the subpattern does not do any capturing, and is not counted when computing the number of any subsequent capturing subpatterns. For example, if the string "the white queen" is matched against the pattern the ((?:red|white) (king|queen)) the captured substrings are "white queen" and "queen", and are numbered 1 and 2.

                            Da wird zuerst gesagt, dass eine Untergruppe, die mit "?:" beginnt, nicht gecaptured wird, und dann steht im Satz danach genau das Gegenteil, nämlich dass "white queen" und "queen" gecaptured worden sind.

                            Was ich prinzipiell nicht verstehe, ist, wieso es überhaupt nötig ist, nicht zu wollen, dass eine Unterausdruckgruppe eine Nummer bekommt.

                            Aber kommen wir zum ursprünglichen Problem: Ich möchte, dass vor meinen 5-10 Ziffern, also vor dem \d{5,10} entweder ein Nicht-Ziffer-Zeichen ist oder der Treffer am Anfang des Suchstrings ist, dass also davor überhaupt nichts steht. Im regulären Ausdruck steht ^ für den Anfang des Suchstrings. Also "Anfang Suchstring _oder_ Nicht-Ziffer-Zeichen" wäre demnach enweder ein ^|\D oder mit Klammern ein (^|\D). Das ist aber offenbar falsch. Vor das ^ _muss_ unser "?:" kommen, damit es funktioniert. Aber wieso? "Es wird dann nicht gecaptured" ist ja keine Erklärung, wieso es überhaupt sein muss! Kannst Du mir das bitte in einem verständlichen nicht-techsprech-deutsch erklären?

                            Mit lieben Grüßen

                            Melvin Cowznofski

                            --

                            Melvin Cowznofski
                            What – me worry?
                            1. Tach!

                              There are often times when a grouping subpattern is required without a capturing requirement. If an opening parenthesis is followed by "?:", the subpattern does not do any capturing, and is not counted when computing the number of any subsequent capturing subpatterns. For example, if the string "the white queen" is matched against the pattern the ((?:red|white) (king|queen)) the captured substrings are "white queen" and "queen", and are numbered 1 and 2.

                              Da wird zuerst gesagt, dass eine Untergruppe, die mit "?:" beginnt, nicht gecaptured wird, und dann steht im Satz danach genau das Gegenteil, nämlich dass "white queen" und "queen" gecaptured worden sind.

                              Das ?: steht nur im Subpattern (red|white). Die Gruppe (king|queen) wird gefangen und außerdem steht alles beides und ein Leerzeichen in einer weiteren Gruppe. Du hast da also drei Gruppen und zwei davon werden gefangen. Ohne das ?: würde das white noch ein weiteres Mal in den Matches/Backreferences auftauchen.

                              Was ich prinzipiell nicht verstehe, ist, wieso es überhaupt nötig ist, nicht zu wollen, dass eine Unterausdruckgruppe eine Nummer bekommt.

                              Das ?: zeigt dem Leser, dass man hier zwar gruppieren musste, um einen Teilausdruck zu begrenzen, aber das Ergebnis der Gruppe nicht extra braucht. Du kannst das im Grunde auch weglassen. Es ist jedoch verständlicher, wenn du dem Leser sagst, was wichtig ist und was nicht.

                              Ich möchte, dass vor meinen 5-10 Ziffern, also vor dem \d{5,10} entweder ein Nicht-Ziffer-Zeichen ist oder der Treffer am Anfang des Suchstrings ist, dass also davor überhaupt nichts steht. Im regulären Ausdruck steht ^ für den Anfang des Suchstrings. Also "Anfang Suchstring _oder_ Nicht-Ziffer-Zeichen" wäre demnach enweder ein ^|\D oder mit Klammern ein (^|\D). Das ist aber offenbar falsch. Vor das ^ _muss_ unser "?:" kommen, damit es funktioniert. Aber wieso? "Es wird dann nicht gecaptured" ist ja keine Erklärung, wieso es überhaupt sein muss!

                              Wer sagt denn, dass da ein ?: stehen muss? Es geht auch wunderbar ohne. Nur ohne Klammern wird es nichts, weil auch das | gierig ist und nicht nach dem \D Halt macht.

                              dedlfix.

                              1. Hallo dedlfix!

                                Das ?: steht nur im Subpattern (red|white). Die Gruppe (king|queen) wird gefangen und außerdem steht alles beides und ein Leerzeichen in einer weiteren Gruppe. Du hast da also drei Gruppen und zwei davon werden gefangen. Ohne das ?: würde das white noch ein weiteres Mal in den Matches/Backreferences auftauchen.

                                Vereinfacht gesagt: Bei ((a|b)(c|d)) würde es bei einem bd zu drei captures kommen: bd (1), b (2) und d (3). Bei ((?:a|b)(c|d)) fällt die Nummer 2 weg und es kommt zu zwei captures: bd (1) und d (2). Verstehe ich das so richtig?

                                Das ?: zeigt dem Leser, dass man hier zwar gruppieren musste, um einen Teilausdruck zu begrenzen, aber das Ergebnis der Gruppe nicht extra braucht. Du kannst das im Grunde auch weglassen. Es ist jedoch verständlicher, wenn du dem Leser sagst, was wichtig ist und was nicht.

                                Ich habe in den letzten Tagen, weil mir die Sache keine Ruhe gelassen hat, an die 100 verschiedenen Tests mit regulären Ausdrücken gemacht. Auch Versuche ohne dem "?:". Dabei bilde ich mir ein, nie ein korrektes Resultat bekommen zu haben. Das hatte aber offenbar andere Gründe. Ich habe deshalb jedenfalls fälschlicherweise angenommen, dass in unserem Fall das "?:" ein Muss ist.

                                Doch tatsächlich: ~(^|\D)\d{5,10}($|\D)~ funktioniert. Sehe ich es also richtig, dass das nun _endlich_ die korrekte und kürzest mögliche Form ist, damit es zu einem Treffer kommt bei einer Zahl mit 5-10 Stellen?

                                Wer sagt denn, dass da ein ?: stehen muss? Es geht auch wunderbar ohne. Nur ohne Klammern wird es nichts, weil auch das | gierig ist und nicht nach dem \D Halt macht.

                                Das wäre jetzt dann meine letzte Unklarheit. Wie meinst Du das mit dem "gierig sein" ohne Klammern? ~(^|a)bc~ matcht a und abc. ~^|abc~ matcht _alles_, weil das sagt aus, dass es entweder mit abc oder mit einem Anfang anfangen muss. Wolltest Du darauf hinweisen?

                                Mit lieben Grüßen

                                Melvin Cowznofski

                                --

                                Melvin Cowznofski
                                What – me worry?
                                1. Tach!

                                  Vereinfacht gesagt: Bei ((a|b)(c|d)) würde es bei einem bd zu drei captures kommen: bd (1), b (2) und d (3). Bei ((?:a|b)(c|d)) fällt die Nummer 2 weg und es kommt zu zwei captures: bd (1) und d (2). Verstehe ich das so richtig?

                                  So ist es.

                                  Doch tatsächlich: ~(^|\D)\d{5,10}($|\D)~ funktioniert. Sehe ich es also richtig, dass das nun _endlich_ die korrekte und kürzest mögliche Form ist, damit es zu einem Treffer kommt bei einer Zahl mit 5-10 Stellen?

                                  Bei höchstens einer solchen Zahl und es dürfen keine weiteren Ziffern im Text enthalten sein.

                                  Wer sagt denn, dass da ein ?: stehen muss? Es geht auch wunderbar ohne. Nur ohne Klammern wird es nichts, weil auch das | gierig ist und nicht nach dem \D Halt macht.

                                  Das wäre jetzt dann meine letzte Unklarheit. Wie meinst Du das mit dem "gierig sein" ohne Klammern? ~(^|a)bc~ matcht a und abc. ~^|abc~ matcht _alles_, weil das sagt aus, dass es entweder mit abc oder mit einem Anfang anfangen muss. Wolltest Du darauf hinweisen?

                                  ^|\D\d{5,10} - Das | hat links das ^ und rechts nicht nur das \D, sondern den gesamten Rest. Es ist nicht so, dass wenn links nur ein Zeichen steht, rechts auch nur ein Zeichen genommen wird. Es ist quasi gierig, dass rechts (ebenso wie auch links) so viel wie möglich genommen wird. Das muss man mit einer Gruppierung (auch wenn man das Gruppierergebnis nicht extra braucht) begrenzen.

                                  (^|a)bc matcht abc an beliebiger Position oder bc am Anfang. ^|abc matcht alles, weil alles einen Anfang hat und damit das Muster schon erfüllt ist.

                                  dedlfix.

                                  1. Hallo Dedlfix!

                                    So ist es.

                                    Na dann habe ich zumindest wieder einen kleinen Teil dazugelernt.

                                    Doch tatsächlich: ~(^|\D)\d{5,10}($|\D)~ funktioniert.
                                    Bei höchstens einer solchen Zahl und es dürfen keine weiteren Ziffern im Text enthalten sein.

                                    Wenn die Fragestellung lautet, ob in dem Text eine Zahl mit 5-10 Ziffern vorkommt, passt es auf jeden Fall. Natürlich macht das keine Aussage darüber, ob evt. noch andere Zahlen, auf die das zutrifft, im Suchstring vorkommen. Ich nehme an, das meintest Du mit der Regel, dass weiteren Ziffern im Text enthalten sein dürfen. Sonst wäre es ja egal, was sich überdies noch im Suchstring befindet.

                                    (^|a)bc matcht abc an beliebiger Position oder bc am Anfang. ^|abc matcht alles, weil alles einen Anfang hat und damit das Muster schon erfüllt ist.

                                    Passt, dann habe ich Dich eh richtig verstanden.

                                    Mit lieben Grüßen

                                    Melvin Cowznofski

                                    --

                                    Melvin Cowznofski
                                    What – me worry?
                                    1. Tach!

                                      Doch tatsächlich: ~(^|\D)\d{5,10}($|\D)~ funktioniert.
                                      Bei höchstens einer solchen Zahl und es dürfen keine weiteren Ziffern im Text enthalten sein.

                                      Da lag ich falsch. Es steht da ja nur ein \D und kein \D*, also bezieht sich das Muster nur auf das unmittelbar davor- oder danachstehende Einzelzeichen.

                                      Wenn die Fragestellung lautet, ob in dem Text eine Zahl mit 5-10 Ziffern vorkommt, passt es auf jeden Fall. Natürlich macht das keine Aussage darüber, ob evt. noch andere Zahlen, auf die das zutrifft, im Suchstring vorkommen. Ich nehme an, das meintest Du mit der Regel, dass weiteren Ziffern im Text enthalten sein dürfen. Sonst wäre es ja egal, was sich überdies noch im Suchstring befindet.

                                      Mit dem Muster, so wie es oben steht, passt es auf die erstbeste separat stehende Folge von 5 bis 10 Ziffern. Was davor oder danach kommt (bis auf das jeweils eine Zeichen), kann beliebig sein, also auch Ziffern und Zahlen enthalten.

                                      dedlfix.

                                      1. Hallo dedlfix!

                                        Meine Unklarheiten sind im Großen und Ganzen somit erledigt! Vielen Dank für die Hilfe und die Beantwortung meiner "Nachfragen", obwohl der Thread eigentlich eh schon längst "geschlossen" war.

                                        Mit lieben Grüßen

                                        Melvin Cowznofski

                                        --

                                        Melvin Cowznofski
                                        What – me worry?
                    2. @@Melvin Cowznofski:

                      nuqneH

                      aber einen funktionierenden regulärten Ausdruck hat noch niemand gepostet.

                      Nicht?

                      Wenn die Zahl nicht mehr als 10 Ziffern haben soll, bedeutet das: Nach der letzten Ziffer kommt entweder irgend ein Zeichen ausser einer Ziffer, ein Leerzeichen

                      Ein Leerzeichen ist auch ein Zeichen außer einer Ziffer.

                      oder _nichts_, weil der String zu Ende ist.

                      Eben.

                      Und genau hier stecke ich seit Tagen fest.

                      Wo sollte es auch noch hingehen?

                      Qapla'

                      --
                      „Talente finden Lösungen, Genies entdecken Probleme.“ (Hans Krailsheimer)
                      1. Hallo Gunnar!

                        aber einen funktionierenden regulärten Ausdruck hat noch niemand gepostet.
                        Nicht?

                        Ich habe nichts gefunden.

                        Also eher sowas wie (?:^|[^0-9])[0-9]{5,10}(?:$|[^0-9])

                        Wenn Du das meinst: Ich habe beim Lesen aller Beiträge in diesem Post mich nicht weiter damit auseinandergesetzt weil mir ein "Also eher sowas wie" suggeriert, dass das nur so eine angedachte Richtung ist und keine fertige Lösung.

                        Leider verstehe ich die Syntax zu Beginn und zu Ende nicht. Bedeutet '(?:^|[^0-9])' ein "Entweder zu Beginn _oder_ ein Nicht-Ziffern-Zeichen" und '(?:$|[^0-9])' somit "Entweder Ende _oder_ ein Nicht-Ziffern-Zeichen"? Weil das wäre dann die Antwort auf die Frage, die ich dedlfix vor 2 Minuten geschrieben habe.

                        Nur ... wozu ist das '?:' an diesen Stellen da? Ich finde keine Interneseite und kein Tutorial, in dem das erklärt wird. Und wieso nicht einfach '(^|[^0-9])' und '($|[^0-9])'?

                        Und genau hier stecke ich seit Tagen fest.
                        Wo sollte es auch noch hingehen?

                        Zum Beispiel zu einem Punkt, wo ich auch _verstehe_, wieso welche REGEX hier richtig ist?

                        Mit lieben Grüßen

                        Melvin Cowznofski

                        --

                        Melvin Cowznofski
                        What – me worry?
                        1. Tach!

                          Nur ... wozu ist das '?:' an diesen Stellen da? Ich finde keine Interneseite und kein Tutorial, in dem das erklärt wird. Und wieso nicht einfach '(^|[^0-9])' und '($|[^0-9])'?

                          Im Zusammenhang mit Gruppierungsklammern () ergibt ?: eine non-capturing Gruppe, sie taucht dann nicht unter den Matches auf. Das ist im PHP-Perl-Regexp-Kapitel beschrieben. Leider ist es, sich über das Inhaltsverzeichnis hangelnd, nur dann zu finden, wenn man weiß, wonach man sucht - oder einfach alles durchschaut. Leider wurde meine Anregung abgelehnt, im Inhaltsverzeichnis diese Zeichenkombinationen mit aufzuführen.

                          dedlfix.

                        2. Moin,

                          Nur ... wozu ist das '?:' an diesen Stellen da? Ich finde keine Interneseite und kein Tutorial, in dem das erklärt wird. Und wieso nicht einfach '(^|[^0-9])' und '($|[^0-9])'?

                          Ich musste auch lange nach einem Tutorial suchen, welches mit Gunnars reguläre Expressionen hinreichend erklärte. Zu dem konkreten Problem: diese Seite, zweiter Absatz. Dort wird erklärt, dass das Fragezeichen und der Doppelpunkt der Engine sagen, dass sie keine Backreference erstellen soll, da normale Klammern selbiges tun.

                          Zum Beispiel zu einem Punkt, wo ich auch _verstehe_, wieso welche REGEX hier richtig ist?

                          Oft helfen zum verstehen auch RegEx-Analyzer wie der hier.

                          Grüße Marco

                          --
                          Ich spreche Spaghetticode - fließend.
                2. Tach!

                  Aber er erkennt auch nicht meine PLZ in dem Ausdruck "Meine Telefonnummer lautet 123451234512345 und meine Postleitzahl 12345."

                  In dem Ausdruck ist deine Postleitzahl gar nicht enthalten. :-P

                  Der OP hat nur sehr abstrakt beschrieben, was er sucht. Daraus geht nicht hervor, ob er nur eine 5-10-stellige Zahl sucht oder mehrere enthalten sein dürfen, oder ob er gar nicht zählen soll, wenn kürzere Zahlen vorkommen. Oder vielleicht will er ja unabhängig vom Rest des Ausdrucks nur solche Zahlen extrahieren.

                  dedlfix.

                  1. Om nah hoo pez nyeetz, dedlfix!

                    Aber er erkennt auch nicht meine PLZ in dem Ausdruck "Meine Telefonnummer lautet 123451234512345 und meine Postleitzahl 12345."

                    In dem Ausdruck ist deine Postleitzahl gar nicht enthalten. :-P

                    In dem Ausdruck ist interessanterweise überhaupt keine Postleitzahl enthalten.

                    Matthias

                    --
                    Der Unterschied zwischen Java und JavaScript ist größer als der zwischen Wachs und Wachstube.

                    1. Hallihallo!

                      Aber er erkennt auch nicht meine PLZ in dem Ausdruck "Meine Telefonnummer lautet 123451234512345 und meine Postleitzahl 12345."

                      In dem Ausdruck ist deine Postleitzahl gar nicht enthalten. :-P

                      In dem Ausdruck ist interessanterweise überhaupt keine Postleitzahl enthalten.

                      Doch: PLZ 51234

                      Beste Grüsse,
                          Tobias Hahner

                      1. Om nah hoo pez nyeetz, Tobias Hahner!

                        Aber er erkennt auch nicht meine PLZ in dem Ausdruck "Meine Telefonnummer lautet 123451234512345 und meine Postleitzahl 12345."
                        In dem Ausdruck ist deine Postleitzahl gar nicht enthalten. :-P
                        In dem Ausdruck ist interessanterweise überhaupt keine Postleitzahl enthalten.
                        Doch: PLZ 51234

                        Schon kurz nach dem Abschicken war mir bewusst, dass ich das Wort "deutsche" vergessen habe.

                        2345 ist beispielsweise die Postleitzahl von Brunn am Gebirge (Niederösterreich).

                        Matthias

                        --
                        Der Unterschied zwischen Java und JavaScript ist größer als der zwischen Butt und Butter.

                        1. Hallihallo!

                          Wenn man es drauf anlegt:
                          12345 ist ein Bereich in Berlin... PLZ 12345
                          45123 ist in Essen: PLZ 45123

                          Aber mal im Ernst:
                          Ursprünglich wollte ich eigentlich nur ein Bisschen Klugscheissern, aber später ist mir dann
                          aufgefallen, dass ich besonders _mich selbst_ mit genau der gleichen Art von "Klugscheisserei" immer wieder dazu animiere, über ein augenscheinlich simples Problem auch mal doppelt nachzudenken.
                          Zu oft habe ich schon Stunden damit verbracht, die Ursache von unerwarteten Ergebnissen zu finden...

                          Beste Grüsse,
                              Tobias Hahner

                          1. Om nah hoo pez nyeetz, Tobias Hahner!

                            Wenn man es drauf anlegt:
                            12345 ist ein Bereich in Berlin... PLZ 12345
                            45123 ist in Essen: PLZ 45123

                            Tja. Ich hab die deutsche Post gefragt. Und die sagt zu 12345, es gäbe keinen Ort mit dieser PLZ.

                            Ursprünglich wollte ich eigentlich nur ein Bisschen Klugscheissern, aber später ist mir dann
                            aufgefallen, dass ich besonders _mich selbst_ mit genau der gleichen Art von "Klugscheisserei" immer wieder dazu animiere, über ein augenscheinlich simples Problem auch mal doppelt nachzudenken.
                            Zu oft habe ich schon Stunden damit verbracht, die Ursache von unerwarteten Ergebnissen zu finden...

                            Siehste.

                            Zurück zur Post: Eine Suche nach Großempfängern mit der Postleitzahl 12345 ergibt dann 4 Treffer: etwa ein Krankenhaus in 12345 Berlin.

                            Schon komisch.

                            Matthias

                            --
                            Der Unterschied zwischen Java und JavaScript ist größer als der zwischen CAS und Casanova.

                            1. Hallihallo!

                              Eine Suche nach Großempfängern mit der Postleitzahl 12345 ergibt dann 4 Treffer: etwa ein Krankenhaus in 12345 Berlin.

                              Das zeigt also mal wieder, dass man nicht nur die Validierung von Email- Adressen bis zum Exzess treiben kann :-)

                              Beste Grüsse,
                                  Tobias Hahner

                            2. Hallo,

                              Tja. Ich hab die deutsche Post gefragt. Und die sagt zu 12345, es gäbe keinen Ort mit dieser PLZ.

                              und das stimmt ja auch, wenn man konkret nach einem "Ort" fragt, weil Postleitzahlen eben nicht nur Orte oder Ortsbezirke bezeichnen, sondern auch Postfachinhaber oder Großempfänger.

                              Mich wundert übrigens, dass ich auf die Schnelle keine übersichtliche, numerisch geordnete Liste aller Postleitzahlen finden konnte, aus der man für jede tatsächliche vergebene PLZ den Ort, Ortsbezirk oder Inhaber ablesen kann. Für Telefonvorwahlen gibt's das nämlich.

                              Zurück zur Post: Eine Suche nach Großempfängern mit der Postleitzahl 12345 ergibt dann 4 Treffer: etwa ein Krankenhaus in 12345 Berlin.
                              Schon komisch.

                              Ja, es heißt andersrum, dass die Zuordnung selbst bei den Großempfängern nicht umkehrbar eindeutig ist, wenn sich offensichtlich mehrere eine PLZ teilen. Das ist mir auch neu.

                              Ciao,
                               Martin

                              --
                              Abraham sprach zu Bebraham: Kann i mal dei Cebra ham?
                              Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
              2. @@Melvin Cowznofski:

                nuqneH

                Und 42 hat nur 2 Stellen. Ich hab's grad nochmal durchgezählt!

                Grmpf, da hast du unweigerlich recht. Ich hatte zuerst auch "123456789012 foo 12345" zu stehen. Um zu verdeutlichen, dass nicht die 12345 in 123456789012 gemeint war, hab ich das geändert. Anstatt nun 54321 zu nehmen, hab ich fälschlicherweise die 42 genommen.

                Hm, ist 42 nun doch nicht die Antwort auf alles?

                Qapla'

                --
                „Talente finden Lösungen, Genies entdecken Probleme.“ (Hans Krailsheimer)
    2. @@Melvin Cowznofski:

      nuqneH

      if (preg_match("/[1]{5,10}$/", $text))
      echo "Zahl ist drin!";

      Das ist eine falsche PHP Syntax!
      Das, was bei Zutreffen der Bedingung passieren soll, steht in geschwungenen Klammern!

      Nein, die Syntax ist korrekt. Bei einer einzigen Anweisung sind keine Klammern nötig.

      Es ist aber guter Stil, dennoch Klammern zu setzen.

      Du willst aber, dass auch davor oder danach etwas stehen darf. Also ein _beliebiges Zeichen_ (dafür steht der Punkt) darf _kein_ Mal oder beliebig oft (dafür steht der Stern) vorkommen.

      Nein, kein beliebiges Zeichen. Ansonsten könnte es ja eine Ziffer sein und damit würden auch Zahlen mit mehr als 10 Ziffern matchen.

      Also eher sowas wie (?:^|[^0-9])[0-9]{5,10}(?:$|[^0-9])

      oder wenn die Zahl durch Leerzeichen berenzt wird \b[0-9]{5,15}\b

      Qapla'

      --
      „Talente finden Lösungen, Genies entdecken Probleme.“ (Hans Krailsheimer)

      1. 0-9 ↩︎

      1. Hallo Gunnar!

        Es ist aber guter Stil, dennoch Klammern zu setzen.

        Finde ich auch!

        Du willst aber, dass auch davor oder danach etwas stehen darf. Also ein _beliebiges Zeichen_ (dafür steht der Punkt) darf _kein_ Mal oder beliebig oft (dafür steht der Stern) vorkommen.
        Nein, kein beliebiges Zeichen. Ansonsten könnte es ja eine Ziffer sein und damit würden auch Zahlen mit mehr als 10 Ziffern matchen.

        Du hast natürlich _völlig_ Recht! Ich lag falsch! Vielleicht sollte ich mit halbgeschlossenen Augen (und Hirn) um halb 2 Uhr Nachts keine Fragen beantworten. Mea culpa! =)

        Mit lieben Grüßen

        Melvin Cowznofski

        --

        Melvin Cowznofski
        What – me worry?
      2. Hallo Leute,

        wow, soviele Antworten. :)

        Also nur um meine Schreibweise zu rechtfertigen, eben, weil es genau EINE Zeile ist die ich angegeben habe kann es eben ohne geschweifte Klammern stehen, ist mir wohl bekannt. ;)

        Aber danke schonmal dafür.

        Wow, was ein riesiger Ausdruck daraus wird, ich bin immer wieder beeindruckt wer da alles durchblickt, ich gebe zu, ich hasse reg. Exp., aber ich probiere die mal.

        Gruß
        Doc

    3. Hallo nochmal,

      so, vielen Dank für die raschen Antworten. Ich gebe echt zu, aus diesem Ausdruck:

        
      if ( preg_match('~^.*[0-9]{5,10}.*$~', $text) )  
        
              {  
        
                  // ....  
        
              }  
        
      
      

      werde ich gar nicht schlau, aber ich habe ihn getestet, er funktioniert ja auch und liefert z.B. als Ergebnis in preg_match() den ganzen String, sofern die entsprechende Zahl vorkommt.

      Jedoch war der Einwand einfach meinen Ausdruck ohne ^ und $ zu verwenden wesentlich kürzer und liefert auch das Ergebnis und hier im Resultat sogar nur die Zahl, obwohl ich diese nicht weiterverarbeiten muss. :)

      Und nochmals ja, ich weiß, wann geschweifte Klammern gesetzt werden müssen, es sollte ja nur fix gehen hier. ;)

      So, schönes Wochenende, Gruß
      Doc

      1. @@DocSky:

        nuqneH

        werde ich gar nicht schlau,

        ^ steht für Anfang, $ für Ende. .* für beliebig viele (auch keins) beliebige Zeichen. Kann man alles http://de.selfhtml.org/perl/sprache/regexpr.htm#zeichenketten@title=nachlesen. Was ist daran unverständlich?

        aber ich habe ihn getestet,

        Nicht genau genug.

        er funktioniert ja auch

        Nein, tut er nicht. Er lässt 12345678901 (11 Stellen) durch. Soll er aber nicht.

        Qapla'

        --
        „Talente finden Lösungen, Genies entdecken Probleme.“ (Hans Krailsheimer)
      2. Tach!

        Ich gebe echt zu, aus diesem Ausdruck:
        if ( preg_match('~^.*[0-9]{5,10}.*$~', $text) )
        werde ich gar nicht schlau,

        Er findet zu viel. Da . angegeben ist, können auch weitere Ziffern vorangehen oder folgen.

        ^ Start des Ausdrucks (in dem Fall; wenn Multiline-Modifizierer verwendet wurde: Anfang einer Zeile)
        . beliebiges Zeichen (aber auch Ziffern)
        * beliebig viel vom vorhergehenden Ausdruck
        [0-9]{5,10} 5 bis 10 ASCII-Ziffern
        .* s.o.
        $ Ende des Ausdrucks (Multiline: Ende der Zeile)

        dedlfix.

  2. gudn tach!

    Ich möchte aus folgenden Strings das vorkommen einer Zahl prüfen, wie:
    "der Text ist doof 12345678"
    "Probetext 1234567890"
    "1234567"
    "Noch mehr 123456789 Text kommt nicht"

    ich habe das mit folgender Funktion probiert:
    if (preg_match("/^[0-9]{5,10}$/", $text))
      echo "Zahl ist drin!";

    Das funzt aber nicht. :'(
    Also {5,10} steht drin, da die Zahl mindestens 5 Stellen, maximal aber 10 nicht überschreiten soll.

    es kamen schon so viele antworten kamen und auch ich moechte mich einer weiteren beteiligen. ich fand bisher die antwort von Gunnar am besten, da sie die richtigen fragen nach den grenzen stellt.

    das regexp-pattern fuer die aufgabe, strings zu matchen, die 5- bis 10-stellige zahlen enthalten, koennte also z.b. lauten:
    1.  /\b[0-9]{5,10}\b/
    2.  /(?<![0-9])[0-9]{5,10}(?![0-9])/
    oder
    3.  /(?<![^ ])[0-9]{5,10}(?![^ ])/

    zu 1.: \b weisst etwa "word boundary" und markiert eine stelle, an der ein zeichen, dass ein buchstabe, eine ziffer oder ein '_' ist, nicht auf ein zeichen treffen darf, das ebenfalls buchstabe, ziffer oder '_' ist. gematcht wuerde also z.b. "1234567", "foo 123456-193865 bar", aber weder foo123456-193865bar" noch "foo12345bar".

    zu 2.: (?<![0-9]) heisst etwa "vor dem naechsten zeichen darf kein zeichen der klasse [0-9] stehen". entsprechend heisst (?![0-9]) etwa "nach dem naechsten zeichen darf kein zeichen der klasse [0-9] stehen". gematcht wuerde also z.b. "1234567", "foo 123456-193865 bar" und auch "foo123456-193865bar" sowie "foo12345bar".

    zu 3.: (?<![^ ]) heisst etwa "vor dem naechsten zeichen darf kein zeichen stehen, das kein leerzeichen ist". entsprechend heisst (?![^ ]) etwa "nach dem naechsten zeichen darf kein zeichen stehen, das kein leerzeichen ist". beachte, dass dies etwas anderes ist als (?<= ) ("vor dem naechsten zeichen muss ein leerzeichen stehen"). gematcht wuerde also z.b. "1234567" und "foo 123456 193865 bar", aber weder "foo 123456-193865 bar" noch "foo123456-193865bar" noch "foo12345bar".

    prost
    seth