frankx: regexp ^ Anfang, oder, Verneinung

Hellihello

was ich irgendwie nicht hinbekomme ist:

Am Anfang darf nicht aaa oder bbb vorkommen.

Treffer wären alles außer

aaa......
bbb......

die Punkte jetzt als u.s.w. gemeint.

^(aaa|bbb).* wäre, dass am Anfang aaa oder bbb stehen muss. Wie aber kommt die Verneinung dazu?

Dank und Gruß,

frankx

  1. Hallo frankx,

    ^(aaa|bbb).* wäre, dass am Anfang aaa oder bbb stehen muss. Wie aber kommt die Verneinung dazu?

    Die Verneinung müsste noch in die Klammer also:
    ^(^aaa|^bbb)

    Gruß,
    Dodwin

    --
    Dodwin
    1. Hellihello Dodwin,

      ^(aaa|bbb).* wäre, dass am Anfang aaa oder bbb stehen muss. Wie aber kommt die Verneinung dazu?

      Die Verneinung müsste noch in die Klammer also:
      ^(^aaa|^bbb)

      mmh...;

        
      <?php  
      $subject = "bbbaaabcdef";  
      $pattern = '/^(^aaa|^bbb).*/';  
      preg_match($pattern, $subject, $matches);  
      print_r($matches);  
      ?>  
      
      

      bringt bei mir:

      Array
      (
          [0] => bbbaaabcdef
          [1] => bbb
      )

      Dank und Gruß,

      frankx

      1. gudn tach!

        Die Verneinung müsste noch in die Klammer also:
        ^(^aaa|^bbb)

        wie gesagt: kaese.

        vorschlag:

          
        $subject = "bbbaaabcdef";  
        $pattern = '/^(aaa|bbb)/';  
        if(preg_match($pattern, $subject)==0)  
          echo '$subject ist wie gewuenscht.';
        

        ansonsten gibt's auch noch eine methode ueber zero-width negative look-ahead assertions:

        der ausdruck waere dann:

        /^(?!aaa|bbb)/

        der macht das, was du urspruenglich wolltest.

        prost
        seth

        1. Hellihello seth,

          ansonsten gibt's auch noch eine methode ueber zero-width negative look-ahead assertions:

          der ausdruck waere dann:

          /^(?!aaa|bbb)/

          der macht das, was du urspruenglich wolltest.

          hört sich prima an (;-).

          A zero-width negative look-ahead assertion. For example /foo(?!bar)/ matches any occurrence of "foo" that isn't followed by "bar". Note however that look-ahead and look-behind are NOT the same thing. You cannot use this for look-behind. http://perldoc.perl.org/perlre.html

          Heißt also in dem Fall übersetzt: "Der Anfang direkt gefolgt von nicht aaa und auch nicht bbb (= nicht [aaa oder bbb])".

          Dank und Gruß,

          frankx

    2. Hallo,

      ^(aaa|bbb).* wäre, dass am Anfang aaa oder bbb stehen muss. Wie aber kommt die Verneinung dazu?

      Die Verneinung müsste noch in die Klammer also:
      ^(^aaa|^bbb)

      So geht das AFAIK nicht, weil das „^“ nur in eckigen Klammer als Verneinung gilt.

      Der Regexp müsste wohl eher so aussehen:

      /^([^a]{3}|[^b]{3})/

      mfg. Daniel

      1. gudn tach!

        ^(aaa|bbb).* wäre, dass am Anfang aaa oder bbb stehen muss. Wie aber kommt die Verneinung dazu?

        Die Verneinung müsste noch in die Klammer also:
        ^(^aaa|^bbb)

        So geht das AFAIK nicht, weil das „^“ nur in eckigen Klammer als Verneinung gilt.

        genau.
          /^(^aaa|^bbb)/
        matcht alles, was mit ^aaa oder ^bbb beginnt. das wollte der OP aber nicht.

        Der Regexp müsste wohl eher so aussehen:

        /^([^a]{3}|[^b]{3})/

        nein. bbb wird von [^a]{3}\ gematcht und aaa von [^b]{3}.

        prost
        seth

        1. Hallo,

          Der Regexp müsste wohl eher so aussehen:

          /^([^a]{3}|[^b]{3})/

          nein. bbb wird von [^a]{3}\ gematcht und aaa von [^b]{3}.

          Stimmt, das wäre wohl immer true.

          Das:

          /^([^ab]{3})/

          …wiederum matcht auch „bab“ oder „aab“ nicht. Bleibt also doch nur noch die anschließende Invertierung…

          mfg. Daniel

          1. Hellihello

            …wiederum matcht auch „bab“ oder „aab“ nicht. Bleibt also doch nur noch die anschließende Invertierung…

            will heißen, ich suche nach ^(aaa|bbb) und sage dann eben, "wenn nicht" mit der umgebenden Sytax. Beim RewriteRule wäre dass dann "!", wobei vermutlich die Frage ist, ob so eine quasi doppelte Verneinung semantisch sinnvoll wäre.

            Dank und Gruß,

            frankx

            1. Hallo,

              wobei vermutlich die Frage ist, ob so eine quasi doppelte Verneinung semantisch sinnvoll wäre.

              Warum eigentlich doppelte Verneinung? Zuerst sucht man die entspr. Zeichen und dann verneint man sie. Ist für mich ein ja-nein.

              Trotzdem Schade, dass es keine &-Verknüpfungen in Regexp gibt…

              mfg. Daniel

              1. Hellihello Daniel,

                wobei vermutlich die Frage ist, ob so eine quasi doppelte Verneinung semantisch sinnvoll wäre.

                Warum eigentlich doppelte Verneinung? Zuerst sucht man die entspr. Zeichen und dann verneint man sie. Ist für mich ein ja-nein.

                Ja, das hatte ich auch im Hinterkopf und schrub deshalb "quasi" doppelte. Aber das trifft es nicht, sondern eben das was du schreibst nicht das und nicht das, wobei etwas + etwas gleich doppelt etwas und somit dann doch sowas wie eine doppelte Verneinung, quasi? Gut, definiere quasi und es ist nicht mehr allzu früh für mich (auch doppelt veneint?).

                Trotzdem Schade, dass es keine &-Verknüpfungen in Regexp gibt…

                Ja, so dachte ich auch schon.

                Dank und Gruß,

                frankx

          2. gudn tach!

            /^([^a]{3}|[^b]{3})/

            nein. bbb wird von [^a]{3}\ gematcht und aaa von [^b]{3}.

            Stimmt, das wäre wohl immer true.

            nein. auf strings mit weniger als drei zeichen wuerde der ausdruck nicht matchen.

            Bleibt also doch nur noch die anschließende Invertierung…

            ...oder die zero-width negative look-ahead assertions.

            prost
            seth

      2. Hallo D.R.,

        So geht das AFAIK nicht, weil das „^“ nur in eckigen Klammer als Verneinung gilt.

        Achja richtig...
        Meine Regex-Kenntnisse liegen wohl schon etwas zurück...

        Gruß,
        Dodwin

        --
        Dodwin
  2. gudn tach!

    Am Anfang darf nicht aaa oder bbb vorkommen. [...]

    ^(aaa|bbb).* wäre, dass am Anfang aaa oder bbb stehen muss.

    ja, wobei ".*" am schluss ueberfluessig ist.

    Wie aber kommt die Verneinung dazu?

    das ist je nach sprache unterschiedlich. die einfachste methode waere, z.b. in perl statt

    if(/^(aaa|bbb)/)
        mach wadd

    eben

    unless(/^(aaa|bbb)/)
        mach wadd

    prost
    seth