Felix Riesterer: negative lookbehind und negative lookahead SYNTAX???

Liebe Forumsgemeinde,

ich möchte Syntaxhighlighting in Javascript realisieren. Dazu versuche ich den Asterisk (*) einzufärben, wenn er nicht gerade einen CSS-Kommentar einleitet oder beendet. Mein Versuch hatte folgende Syntax:

/(?<!\/)\*(?!\/)/

Dieser Code soll folgendes erreichen: "Finde einen Asterisk, dem kein Slash vorrangeht, und dem auch kein Slash folgt. Matche nur auf dieses eine Zeichen!"

Ich erhalte eine Fehlermeldung von wegen ungültigem Quantifier. Offenbar erwartet Javascript für negative lookbehind eine andere Syntax, als beispielsweise Perl. Also habe ich herumprobiert und folgendes herausgefunden:

Perl: (?<!x)  <->  Javascript (!?<x) ???

Mit der "neuen" Syntax erhalte ich nun zumindest keine Fehlermeldung, aber der Ausdruck matched nicht mehr. Wer weiß Rat? In der Zwischenzeit gehe ich mal die in der Diskussion http://forum.de.selfhtml.org/archiv/2005/6/t110581/ genannten Referenz-Quellen studieren. Würde mich freuen, wenn jemand schneller helfen könnte!

Liebe Grüße aus Ellwangen,

Felix Riesterer.

  1. Hallo,

    es gibt kein lookbehind in ECMAScript/Core JavaScript.

    Matihas

    1. Lieber molily,

      es gibt kein lookbehind in ECMAScript/Core JavaScript.

      vielen Dank für die Antwort. Auf diese Erkenntnis bin ich beim Studium der Referenzen auch gekommen, wollte es aber nicht glauben.

      Ich habe mir nun so beholfen:

      code.replace(/([^\/])\*(?!\/)/gim, '$1<span class="h-selector">*</span>')

      Das Zeichen, das dem Asterisk unmittelbar vorrausgeht, wird in einer Backreference gespeichert und bei der Ersetzung einfach "wieder eingefügt".

      Liebe Grüße aus Ellwangen,

      Felix Riesterer.

      1. gudn tach!

        code.replace(/([^\/])\*(?!\/)/gim, '$1<span class="h-selector">*</span>')

        warum ueberhaupt regexp? (mal abgesehen von dem argument "weil die so geil sind!")

        code_parts=code.split("*");  
        for(i=1;i<code_parts.length;++i){  
          p_len=code_parts[i-1].length;  
          code_parts[i-1]+=((p_len>0 && code_parts[i-1][p_len-1]=="/") || code_parts[i][0]=="/") ? "*" : "<span class="h-selector">*</span>";  
        }  
        code=code_parts.join("");
        

        (hab lange nix mehr mit js gemacht, ich hoffe, die syntax stimmt so einigermassen.)

        prost
        seth