peterS.: textsuche: RegExp-text-search-patterns zur laufzeit erzeugen

Beitrag lesen

gruss juppinger, hi molily,

Schau mal einige Threads unter deinem, da wurde diese Frage
bereits gestellt und beantwortet:
https://forum.selfhtml.org/?t=135748&m=881190

@molily
   nicht ganz, bei juppinger versteckt sich das eigentliche problem
   ganz woanders:

@juppinger

... Nun möchte ich jedoch den zu suchenden Text (Suchtext)
aus einer Variable holen, weiss aber nicht, wie ich das machen
soll...

var suchText = "ZuSuchenderText";
var neuerText = alterText.replace(/suchText/g, "NeuerText");

Das sucht ja jetzt nicht nach "ZuSuchenderText", sondern
nach "suchText".

richtig - bei dem ausdruck /suchText/g handelt es sich um ein RegExp-literal.
   die literalschreibweise ist aber nicht die einzige moeglichkeit RegExp-Objekte
   zu erzeugen.
   es gibt auch den RegExp-Konstruktor, den man mit suchmuster und optionalen
   flags fuettern kann.

fuer Dein bsp. gestaltet sich das dann folgendermassen:

~~~javascript var alterText = "richtig - bei dem ausdruck /suchText/g handelt es sich um ein RegExp-literal.";
   var suchText = "handelt es sich um ein";
   var regXSearch = new RegExp(suchText, "g");

alert(regXSearch + "\n" + (/handelt es sich um ein/g));

var neuerText = alterText.replace(regXSearch, "spricht man auch von einem");

alert(alterText + "\n\n" + neuerText);

  
  
   dabei ist aber zu beachten, dass alle zu suchenden Texte, die Steuerzeichen  
   enthalten, wie sie auch in regulaeren ausdruecken zur anwendung kommen,  
   nicht mit diesem einfachen vorgehen gefunden werden koennen.  
   diese steuerzeichen muessen vor der uebergabe an den konstruktor maskiert  
   werden. deshalb sollte man sich einer methode bedienen, die so aussehen  
   koennte:  
  
   ~~~javascript
String.prototype.toRegExpString = function () {  
     return this.replace(/([\^\$\.\*\+\?\=\!\:\|\\\/\(\)\[\]\{\}])/g,"\\$1");  
   };  
   var alterText = "richtig: bei dem ausdruck (\/suchText\/g) handelt es sich um ein RegExp-literal.";  
   var suchText = "richtig: bei dem ausdruck (\/suchText\/g) handelt es sich um ein RegExp-literal.";  
   var regXSearch = new RegExp(suchText.toRegExpString());  
  
   alert(regXSearch + "\n" + (/richtig: bei dem ausdruck (\/suchText\/g) handelt es sich um ein RegExp-literal./));  
  
   var neuerText = alterText.replace(regXSearch, "genau, denn \/suchText\/g ist ein RegExp-literal!");  
  
   alert(alterText + "\n\n" + neuerText + "\n\n" + alterText.replace(/richtig: bei dem ausdruck (\/suchText\/g) handelt es sich um ein RegExp-literal./, "uups, something wrong here!"));

viel erfolg - peterS. - pseliger@gmx.net

--
»Because objects in JavaScript are so flexible, you will want to think differently about class hierarchies.
Deep hierarchies are inappropriate. Shallow hierarchies are efficient and expressive.« - Douglas Crockford
ie:( fl:) br:> va:( ls:& fo:) rl:| n3;} n4:} ss:} de:µ js:} mo:? zu:]