Robert Bienert: RegExp zur Laufzeit aus String erzeugen

Moin Forum,

wie kann ich denn zur Laufzeit aus einem JavaScript-String einen RegExp erzeugen? Meine Vorstellung brachte mich auf folgendes, was allerdings nicht funktioniert:

var regText = "/(\n\r)+/g";  
var text = "Hallo Forum,\n\ndies ist ein kurzer Text.\n\nDanke!";  
  
var regExp = new RegExp(text);  
  
alert(text.replace(regExp, '_'));    // soll alle \n\r durch '_' ersetzen

Wo ist der Pferdefuß, den ich übersehen habe?

Viele Grüße,
Robert

  1. Wo ist der Pferdefuß, den ich übersehen habe?

    Du versuchst aus einem Text einen regulären Ausdruck zu erzeugen.
    Der Text des Reguläre Ausdruck ist das: var regText = "/(\n\r)+/g";

    Wobei die Anführungszeichen weggelassen werden können und du hast die RegExp direkt.

    var regText = /\n/g;  
    var text = "Hallo Forum,\n\ndies ist ein kurzer Text.\n\nDanke!";  
    alert(text.replace(regText, '_'));    // soll alle \n\r durch '_' ersetzen  
    
    

    wieso eigentlich \n\r?

    Struppi.

    1. Moin,

      Wo ist der Pferdefuß, den ich übersehen habe?

      Du versuchst aus einem Text einen regulären Ausdruck zu erzeugen.

      Das ist korrekt. Mein Beispiel ist natürlich etwas akademisch gewählt. In der Anwendung soll der reguläre Ausdruck aus einem Textfeld genommen werden und liegt dort ja nur in String-Form vor, oder?

      wieso eigentlich \n\r?

      Etwas besseres viel mir auf die Schnelle nicht ein.

      Ich hoffe, dass das Problem jetzt klarer dargestellt ist.

      Viele Grüße,
      Robert

      1. Du versuchst aus einem Text einen regulären Ausdruck zu erzeugen.

        Das ist korrekt. Mein Beispiel ist natürlich etwas akademisch gewählt. In der Anwendung soll der reguläre Ausdruck aus einem Textfeld genommen werden und liegt dort ja nur in String-Form vor, oder?

        Klar, trotzdem erzeugt dein akademisches Beispiel den Ausdruck nicht aus dem richtigen String, sondern aus dem String den du durchsuchen willst, dass ist natürlich Unsinn.

        wieso eigentlich \n\r?

        Etwas besseres viel mir auf die Schnelle nicht ein.

        Wie kommt denn das \r hinter den Zeilenumbruch?

        Struppi.

        1. Moin,

          Klar, trotzdem erzeugt dein akademisches Beispiel den Ausdruck nicht aus dem richtigen String, sondern aus dem String den du durchsuchen willst, dass ist natürlich Unsinn.

          In der Tat, eigentlich sollte der RegExp auch aus regText erzeugt werden, was aber auch nicht zufriedenstellend funktioniert hat. Mathias' Tipp hat mich dann auf eine funktionierende Spur geführt.

          Wie kommt denn das \r hinter den Zeilenumbruch?

          OT: Ich arbeite normalerweise unter Unix, da gibt es nur \n und ich verwechsele immer, wo die DOSen ihr \r noch hin haben möchten. Wieso kann man sich nicht auf ein Zeichen einigen?

          Schönes Wochenende,
          Robert

          1. Wie kommt denn das \r hinter den Zeilenumbruch?

            OT: Ich arbeite normalerweise unter Unix, da gibt es nur \n und ich verwechsele immer, wo die DOSen ihr \r noch hin haben möchten. Wieso kann man sich nicht auf ein Zeichen einigen?

            \n ist auch unter Windows ein Zeilenumbruch, besteht dort aber aus zwei Zeichen, du kannst unter JS im Prinzip immer \n benutzen, da dort i.d.R. ja keine Daten aus unterschiedlichen System gemischt werden.

            Struppi.

  2. Hallo,

    var regText = "/(\n\r)+/g";
    var text = "Hallo Forum,\n\ndies ist ein kurzer Text.\n\nDanke!";

    var regExp = new RegExp(text);

    /(\n\r)+/g ist ein RegExp-Literal, new RegExp nimmt den String ohne »/«-Begrenzer und ohne Flags als ersten Parameter entgegen. Die Flags kommen als String im zweiten Parameter. Bspw. new RegExp("(\n\r)+", "g")

    Vom String "/(\n\r)+/g" kommst du zum RegExp-Objekt hingegen nur über eval(), oder du splittest den String so, dass du new RegExp damit füttern kannst.

    Mathias

    1. Moin Mathias,

      Vom String "/(\n\r)+/g" kommst du zum RegExp-Objekt hingegen nur über eval(), oder du splittest den String so, dass du new RegExp damit füttern kannst.

      Das funktioniert ja bestens, vielen Dank!

      Schönes Wochenende,
      Robert