Frank Bergermann: JavsScript-Variablen in regulären Ausdrücken (z. B. replace)

Hallo,

ich möchte eine JavaScript-Variable in einem regulären Ausdruck benutzen.

Wenn ich keine Optionen angebe, kann ich die die JavaScript-Variable anstelle des regulären Ausdrucks benutzen. Dann funktioniert Suchen/Ersetzen allerdings nur einfach, nicht mehrfach im gleichen Text.
text = text.replace ( suchstring , ersatzstring );

Wenn ich Option g für mehrfaches Vorkommen benutzen möchte, funktioniert die Variable nicht mehr:
text = text.replace ( /$suchstring/g , ersatzstring );
Ersetzt nichts, $suchstring ist wohl leer, Zugriff wahrscheinlich nur unter perl möglich.

Bisher habe ich nur einen Workaround, der aber für große Texte viel zu langsam ist (function replacetext2).

Für ein lauffähiges Beispiel kopiert das folgende in eine leere *.htm-Datei, bei einer Antwort bitte auch eine kurze E-Mail an mich:

<html>
  <head>
    <title>JavsScript-Variablen in regulären Ausdrücken (z. B. bei String.replace)</title>

<script language="JavaScript1.2">
<!--

function replacetext ( text , suchstring , ersatzstring )
// Ersetzt im Text alle Suchstrings durch Ersatzstring
{
 // Im Folgenden bedeutet:
 // Option g: mehrfache Ersetzung
 // $: Variable
 // ohne Optionen auch einfach Variablenname verwendbar, ohne /$g, dann aber Ersetzung nur 1 x

// Folgendes ersetzt nur 1 x:
 text = text.replace ( suchstring , ersatzstring );

// / und /g landen im Suchstring, z. B. "/abc/g", nicht in den Optionen:
 // text = text.replace ( "/" + suchstring + "/g" , ersatzstring );

// Ersetzt nur Zeichenkette "suchstring", nicht den Variableninhalt:
 // text = text.replace ( /suchstring/g , ersatzstring );

// Ersetzt nichts, $suchstring ist wohl leer, wahrscheinlich kein Zugriff möglich:
 // text = text.replace ( /$suchstring/g , ersatzstring );

return text
}

function replacetext2 ( text , suchstring , ersatz)
// Nachahmung
// Nachteil: langsam bei großen Texten (z. B. Quellcodes umwandeln)
// Vorteil: kommt ohne String.replace aus, funktioniert deshalb auch mit Browsernversionen kleiner 4.0
{
 var idx = 0;
 var ausgabe = "";
 while ( idx < text.length )
 {
  if ( text.substring(idx,idx+suchstring.length) == suchstring )
  {
   ausgabe += ersatz;
   idx += suchstring.length;
  }
  else
  {
   ausgabe += text.charAt(idx);
   idx++;
  }
 }
 return ausgabe;
}

function Umwandlung(text)
{
 //text = text.replace ( /x/g , "y" ) // läuft, aber nicht mit Variable
 text = replacetext ( text , "x" , "y" ) // läuft nicht
 return text
}

function Berechnung()
{
 with(document.Formular)
 {
  textout.value=Umwandlung(textin.value)
 }
}

//-->
</script>

</head>
  <body onload="document.Formular.textin.focus()">
    <center>
      <h4>JavsScript-Variablen in regulären Ausdrücken (z. B. bei String.replace)</h4>
    </center>
    <p>
    <form name=Formular>
      Einfaches Beispiel: Buchstabe x soll durch y ersetzt werden, und zwar mehrfach<br>
      (später soll statt x eine Variable verwendet werden, die in einem Formularfeld eingegeben werden kann)
      <p>
      Eingabe:<br>
      <textarea COLS=70 ROWS=10 name="textin" wrap=physical onChange="Berechnung()"
       onKeyup="Berechnung()"></textarea>
      <!-- Achtung: Text zwischen Textarea-Anfangstag und Endtag wird angezeigt,
           auch Tabs und Zeilenumbrüche
      //-->
      <p>
      Ausgabe:<br>
      <textarea COLS=70 ROWS=10 name="textout" wrap=physical readonly
       onfocus="Berechnung();this.select()"></textarea><br>
      <br>
  </form>
</body>
</html>

  1. Hallo,

    ich möchte eine JavaScript-Variable in einem regulären Ausdruck benutzen.

    Du wirst wohl nicht um die verwendung des RegExp-objects umhinkommen.
    var matcher = new RegExp(suchstring, "g");
    evtl. reicht auch

    dann sollte
    text = text.replace ( matcher , ersatzstring );
    mit global-option funktionieren.

    Vorsicht, das verstehen evtl. nicht alle Browser.
    hier was zum testen:
    <-------------------- schnipp ------------------------>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">

    <html>
    <head>
     <title>Untitled</title>
     <script>
     function repl() {
      var matcher = new RegExp(document.eins.such.value, "g");
      document.eins.testtext.value = document.eins.testtext.value.replace( matcher , document.eins.ersatz.value );
     }
     </script>
    </head>

    <body>

    <form name="eins">
    <input type="text" name="such" value="ist"><br>
    <input type="text" name="ersatz" value="sei"><br>
    <textarea cols="40" rows="6" name="testtext">
    Dies ist ein Text in dem das Wort "ist" mehrmahls vorgekommen ist.
    Die sinnhaftigkeit des ganzen ist fragwuerdig und ist hiermit dahingestellt.
    </textarea><br><br>
    <input type="button" value="mache" onClick="repl()"><br>

    </form>

    </body>
    </html>
    <-------------------- schnapp ------------------------>

    Bye eddie

    1. Danke, eddie, funktioniert einfach super!

      Klammern und andere RegExp-Sonderzeichen müssen mit Rückstrich maskiert werden:

      • in Formular-Textfeld-Eingaben einfach
      • in Strings im Script-Quelltext doppelt (!)

      (War bei meinem Workaround "function replacetext2()" nicht nötig.)