flashnfantasy: lookahaed wie bei PHP

es geht um RegExp und lookahead

folgende PHP-Syntax versuche ich nach JavaScript zu bringen:

m(?!m)

für alle 'm' denen kein weiteres 'm' folgt.

wie lautet der Ausdruck in JavaScript, ich finde da nichts, auch nicht hier in den Archiven.

  1. Tag,

    es geht um RegExp und lookahead

    folgende PHP-Syntax versuche ich nach JavaScript zu bringen:

    m(?!m)

    für alle 'm' denen kein weiteres 'm' folgt.

    wie lautet der Ausdruck in JavaScript, ich finde da nichts, auch nicht hier in den Archiven.

      
    /m[^m]/  
    
    

    ???
    (trifft nicht am string ende)

    Grüße,
    Steffen.

    1. Lieber Steffen,

      m(?!m)

      für alle 'm' denen kein weiteres 'm' folgt.

      /m[^m]/

        
      Das ist ja eine schöne Vereinfachung der Vorgabe, aber bei längeren Zeichenteilketten müsste man die komplette auszuschließende Teilkette zeichenweise in Character-Classes setzen:  
        
      m(?!inimal)  
        
      wäre nach Deiner "Lösung":  
      `m[^i][^n][^i][^m][^a][^l]`{:.language-javascript}  
        
      Ich glaube, das war aber nicht so ganz das oben Gesuchte... oder?  
        
      Liebe Grüße aus [Ellwangen](http://www.ellwangen.de/),  
        
      Felix Riesterer.
      
      1. Tag,

        Lieber Steffen,

        m(?!m)

        für alle 'm' denen kein weiteres 'm' folgt.

        /m[^m]/

        
        >   
        > Das ist ja eine schöne Vereinfachung der Vorgabe, aber bei längeren Zeichenteilketten müsste man die komplette auszuschließende Teilkette zeichenweise in Character-Classes setzen:  
        >   
        > m(?!inimal)  
        >   
        > wäre nach Deiner "Lösung":  
        > `m[^i][^n][^i][^m][^a][^l]`{:.language-javascript}  
        >   
        > Ich glaube, das war aber nicht so ganz das oben Gesuchte... oder?  
        >   
        > Liebe Grüße aus [Ellwangen](http://www.ellwangen.de/),  
        >   
        > Felix Riesterer.  
          
        naja, dann vielleicht so.  
        ~~~javascript
          
        /m[^m]*$/
        

        Es wird doch das letzte "m" in der Zeichenkette gesucht, oder?

        Mir ist die "!?" Syntax noch nicht bekannt.
        Vielleicht bin ich deswegen etwas naiv an das Problem herangegangen.

        Grüße,
        Steffen.

        1. Lieber Steffen,

          naja, dann vielleicht so.

          /m[^m]*$/

          
          >   
          > Es wird doch das letzte "m" in der Zeichenkette gesucht, oder?  
            
          Nein! Die Vorgabe war:  
          
          > für alle 'm' denen kein weiteres 'm' folgt.  
            
          Und genau das kann man mit m[^m] umschreiben. Das war nicht falsch, ist aber nur in diesem Zusammenhang so lösbar.  
            
          
          > Mir ist die "!?" Syntax noch nicht bekannt.  
          
          Die gibt es auch so nicht. :-) Das Ausrufezeichen negiert das Folgende (sprich "!m" heißt "nicht-M"), das Fragezeichen \_davor\_ innerhalb einer neuen Klammer sucht vorwärtsgerichtet, ob es auch ja nicht auftaucht. /(?!m)/ Das ist die Schreibweise für negative lookahead (negatives Vorausschauen).  
            
          /m(?!inimal)/ matched "minimahl" und "minimarkt", da die folgende Zeichenkette nach dem ersten "m" \_nicht\_ "inimal" lautet, denn die würde dem lookahead passen, was sie aber wegen des Ausrufezeichens nicht darf.  
            
          Ich empfehle Dir das (englischsprachige) [Tutorial zu Regexen](http://www.regular-expressions.info/) zum weiteren Nachlesen.  
            
          Liebe Grüße aus [Ellwangen](http://www.ellwangen.de/),  
            
          Felix Riesterer.
          
          1. Hi,

            Nein! Die Vorgabe war:

            für alle 'm' denen kein weiteres 'm' folgt.
            Und genau das kann man mit m[^m] umschreiben.

            Nein.

            m[^m]
            matcht 2 Zeichen, denn es bedeutet: matche ein m, dem ein anderes Zeichen als ein m folgt.

            "Matche ein m, dem kein weiteres m folgt" matcht nur ein Zeichen.

            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. Hi,

            für mein Beispiel wären wahrscheinlich beide Lösungen OK gewesen.

            Der negative Lookahead hat mehrere Vorteile:

            • er kann ganze reguläre Ausdrücke fassen, ist also wesentlich umfangreicher und mächtiger als die buchstabenweise Negation

            • er wird nicht festgehalten, also fällt er aus den Ankern raus

            mein Problem war eigentlich nur, warum ich nirgends (zB. mit Google) eine Erklärung zu den Lookaheads und Lookbehinds für Javascript finde.

            Gruß,
            Mathias

  2. Hallo,

    es geht um RegExp und lookahead

    folgende PHP-Syntax versuche ich nach JavaScript zu bringen:

    m(?!m)

    für alle 'm' denen kein weiteres 'm' folgt.

    Der Ausdruck lautet ebenfalls: m(?!m)

    | x(?!y)  Matches 'x' only if 'x' is not followed by 'y'.
    http://devedge-temp.mozilla.org/library/manuals/2000/javascript/1.5/reference/regexp.html#1207827

    | The form (?! Disjunction ) specifies a zero-width negative lookahead.
    http://bclary.com/2004/11/07/ecma-262.html#a-15.10.2.8

    Damit hast du sicher schon probiert, was ging denn nicht?
    /m(?!m)/.test("mm") ergibt übrigens genauso true wie preg_match('/m(?!m)/', 'mm') in PHP - nicht irritieren lassen, der Ausdruck trifft jeweils auf das zweite »m« zu. (?!m|$) sollte auch das Stringende ausschließen.

    wie lautet der Ausdruck in JavaScript, ich finde da nichts, auch nicht hier in den Archiven.

    Anlaufstellen: JavaScript-Spezifikation, ECMAScript-Spezifikation, JScript-Spezifikation...

    Mathias

    1. Hallo Molli,

      Der Ausdruck lautet ebenfalls: m(?!m)

      | x(?!y)  Matches 'x' only if 'x' is not followed by 'y'.

      Hab das mal ausprobiert: das Ganze funktioniert tatsächlich in der oben aufgeführten Konstellation ... bei mir aber leider NICHT mit zwei gleichen, aufeinander folgenden Zeichen (z.B. dem "m").

      Kannst Du nochmal testen ?

      MFG Fenn

      1. Hallo,

        Der Ausdruck lautet ebenfalls: m(?!m)

        | x(?!y)  Matches 'x' only if 'x' is not followed by 'y'.

        Hab das mal ausprobiert: das Ganze funktioniert tatsächlich in der oben aufgeführten Konstellation ... bei mir aber leider NICHT mit zwei gleichen, aufeinander folgenden Zeichen (z.B. dem "m").

        Hast du meinen Hinweis beachtet?
        Wie sieht der String aus, auf den der Ausdruck m(?!m) (nicht) zutreffen soll?

        Mathias

        1. Hallo Molli,

          Hast du meinen Hinweis beachtet?

          ich bin leider lernschwach ... es dauert halt.
          Nach einer geringfügigen Umstellung meiner Testanordnung hat es dann aber geklappt:

          reg = /m(?!m)/;

          suche = reg.exec(wert);

          if (suche)
          alert(suche.index)

          Gemeldet wird jeweils der Index-Wert des ersten "m" im String, auf das kein weiteres "m" folgt.

          Uff. Schönen Dank für die Denksportaufgabe ... ;-)

    2. Hallo molily,

      jetzt klappt es bei mir auch, hatte ein etwas komplizierteren Ausdruck gewählt und bin prompt gescheitert.

      Mich wundert es, daß sowas hier im SELFHTML nicht zu finden ist.

      Gruß Mathias

      P.S.: RegExp rulez