Rato Micefarmer: Regex: Unterscheidung Anzahl ungerade/gerade?

Hi!

Wie kann man einen Regex dazu bringen, eine gerade Anzahl eines bestimmten Zeichens zu erlauben, auf eine ungerade Anzahl dieses Zeichens jedoch nicht zu matchen?
Bsp.:
Auf 'tihs\drd' würde der gesuchte Regex matchen, nicht jedoch auf 'tihs\\drd', da hierbei die Anzahl der Backslash ungerade ist.

Wenn das ginge, würde mir das eine Überprüfung im weiteren Skript ersparen.

mfg
Rato

--
§§§
Meine Postings basieren lediglich auf mein Wissen und können völliger Blödsinn sein.
§§§
  1. hi,

    Wie kann man einen Regex dazu bringen, eine gerade Anzahl eines bestimmten Zeichens zu erlauben, auf eine ungerade Anzahl dieses Zeichens jedoch nicht zu matchen?

    Zwei Quantifier nacheinander - im ersten 2 Zeichen verlangen, und dann mit dem zweiten das ganze 1 bis x mal ...?

    gruß,
    wahsaga

    --
    /voodoo.css:
    #GeorgeWBush { position:absolute; bottom:-6ft; }
    1. Zwei Quantifier nacheinander - im ersten 2 Zeichen verlangen, und dann mit dem zweiten das ganze 1 bis x mal ...?

      Keine schlechte Idee, nur habe ich das Problem, dass ich an dieser Stelle nicht nur eine gerade Anzahl dieses Zeichens erlauben will, sondern auch noch andere Zeichen. Nehmen wir einmal an, es ist a-zA-Z und außerdem eine gerade Anzahl von '' erlaubt. Wie mache ich das?

      mfg
      Rato

      --
      §§§
      Meine Postings basieren lediglich auf mein Wissen und können völliger Blödsinn sein.
      §§§
      1. Servus,

        a-zA-Z und außerdem eine gerade Anzahl von ''

        Wie wäre es mit
        a-zA-Z ODER eine gerade Anzahl von ''
        ?

        Gruss
        Patrick

        --
        sh:( fo:| ch:? rl:( br:> n4:( ie:% mo:) va:} de:> zu:) fl:| ss:| ls:[ js:|
        1. Wie wäre es mit
          a-zA-Z ODER eine gerade Anzahl von ''
          ?

          Das Problem ist, dass der Regex nicht nur aus dieser Sache besteht sondern weitaus komplexer und länger ist. Ein ODER bezieht sich ja auf den gesamten Regex. Irgendwie blöd, aber ist nunmal so.
          Ich glaube aber, ich habe die Lösung für mein Problem gerade gefunden.

          mfg
          Rato

          --
          §§§
          Meine Postings basieren lediglich auf mein Wissen und können völliger Blödsinn sein.
          §§§
          1. Servus,

            Ein ODER bezieht sich ja auf den gesamten Regex.

            Absolut nicht. Etwas der Art
            /(komplexer ausdruck)([a-zA-Z]|([\]{2})+)(komplexer ausdruck)/
            ist durchaus möglich.

            Gruss
            Patrick

            --
            sh:( fo:| ch:? rl:( br:> n4:( ie:% mo:) va:} de:> zu:) fl:| ss:| ls:[ js:|
            1. /(komplexer ausdruck)([a-zA-Z]|([\]{2})+)(komplexer ausdruck)/

              [\] hat keinen Sinn. Diese Sammelgruppe hat ja nur ein Zeichen als Inhalt. Ich würde '([\]{2})' durch '(\\)' ersetzen.

              mfg
              Rato

              --
              §§§
              Meine Postings basieren lediglich auf mein Wissen und können völliger Blödsinn sein.
              §§§
              1. Servus,

                das ist doch an der Stelle vollkommen wurscht, ich wollte es nur verdeutlichen. Es ging ums ODER, das deiner Meinung nach nur auf den gesamten Regex anwendbar sei, was auch immer das bedeuten mag. Dem ist eben nicht so.

                Gruss
                Patrick

                --
                sh:( fo:| ch:? rl:( br:> n4:( ie:% mo:) va:} de:> zu:) fl:| ss:| ls:[ js:|
              2. gudn tach!

                es geht hier ein wenig drunter und drueber was das maskieren von backslashes betrifft.

                /(komplexer ausdruck)([a-zA-Z]|([\]{2})+)(komplexer ausdruck)/

                [\] hat keinen Sinn.

                in php-syntax hat es sinn, wenn man davon ausgeht, dass es sich tatsaechlich um den regulaeren ausdruck handelt und nicht um den string, der an preg_match (oder was auch immer) uebergeben wird.
                  preg_match('/[\\]/', $s, $r);
                wuerde genauso wie
                  preg_match("/[\\]/", $s, $r);
                zu einer syntaxfehlermeldung fuehren.
                dagegen wuerde
                  preg_match('/[\\\\]/', $s, $r);
                genau ein backslash matchen; waere also dasselbe wie
                  preg_match('/\\\\/', $s, $r);

                Diese Sammelgruppe hat ja nur ein Zeichen als Inhalt.

                was ist eine sammelgruppe?

                Ich würde '([\]{2})' durch '(\\)' ersetzen.

                warum?
                wenn wir schon die fertigen regulaeren ausdruecke betrachten gilt:
                ([\]{2}) ist dasselbe wie (\{2}) und dasselbe wie (\\) und wuerde genau zwei backslashes matchen.

                wenn wir den kram als strings betrachten gilt:
                '([\]{2})' ist ein syntax-fehler und (\\) matcht genau einen backslash. bringt also beides nix.

                um zwei backslashes zu matchen, muss man in php also sowas schreiben wie
                  preg_match('/\\\\{2}/', $s, $r);
                oder
                  preg_match('/\\\\\\\\/', $s, $r);

                hmm, perl ist mir da mal wieder viel lieber: $s=~/\\{2}/;

                prost
                seth

          2. gudn tach!

            Das Problem ist, dass der Regex nicht nur aus dieser Sache besteht sondern weitaus komplexer und länger ist.

            dann praezisiere deine frage.

            Ein ODER bezieht sich ja auf den gesamten Regex. Irgendwie blöd, aber ist nunmal so.

            mit parantheses (runden klammern wie diesen hier) kann man den wirkungsbereich vom ODER, also von |, definieren.

            Ich glaube aber, ich habe die Lösung für mein Problem gerade gefunden.

            das poste sie bitte; fuer's archiv. und vielleicht koennen wir sie ja noch verbessern.

            prost
            seth