1924 Stimmen

Wie verwendet man eine Variable in einem regulären Ausdruck?

Ich würde gerne eine String.replaceAll() Methode in JavaScript und ich denke, dass die Verwendung einer Regex wäre am knappsten Weg, es zu tun. Allerdings kann ich nicht herausfinden, wie man eine Variable in eine Regex übergeben. Ich kann dies bereits tun, die alle Instanzen von ersetzen wird "B" con "A" .

"ABABAB".replace(/B/g, "A");

Aber ich möchte etwas in dieser Art machen:

String.prototype.replaceAll = function(replaceThis, withThis) {
    this.replace(/replaceThis/g, withThis);
};

Aber natürlich wird dadurch nur der Text ersetzt "replaceThis" ...also wie übergebe ich diese Variable an meine Regex-Zeichenkette?

2387voto

Eric Wendelin Punkte 40906

Anstelle der Verwendung des /regex\d/g Syntax, können Sie eine neue RegExp Objekt:

var replace = "regex\\d";
var re = new RegExp(replace,"g");

Auf diese Weise können Sie Regex-Objekte dynamisch erstellen. Dann werden Sie tun:

"mystring1".replace(re, "newstring");

280voto

Gracenotes Punkte 2692

Wie Eric Wendelin erwähnte, können Sie so vorgehen:

str1 = "pattern"
var re = new RegExp(str1, "g");
"pattern matching .".replace(re, "regex");

Daraus ergibt sich "regex matching ." . Es schlägt jedoch fehl, wenn str1 gleich "." . Sie würden erwarten, dass das Ergebnis lautet "pattern matching regex" und ersetzt die Periode durch "regex" aber es wird sich herausstellen, dass es...

regexregexregexregexregexregexregexregexregexregexregexregexregexregexregexregexregexregex

Dies liegt daran, dass, obwohl "." ein String ist, wird er im RegExp-Konstruktor immer noch als regulärer Ausdruck interpretiert, d.h. jedes Zeichen ohne Zeilenumbruch, also jedes Zeichen im String. Zu diesem Zweck kann die folgende Funktion nützlich sein:

 RegExp.quote = function(str) {
     return str.replace(/([.?*+^$[\]\\(){}|-])/g, "\\$1");
 };

Dann können Sie das tun:

str1 = "."
var re = new RegExp(RegExp.quote(str1), "g");
"pattern matching .".replace(re, "regex");

nachgebend "pattern matching regex" .

150voto

bobince Punkte 512550

"ABABAB".replace(/B/g, "A");

Wie immer gilt: Verwenden Sie Regex nur, wenn Sie es müssen. Für eine einfache Zeichenfolge ersetzen, ist das Idiom:

'ABABAB'.split('B').join('A')

Dann müssen Sie sich nicht um die in der Antwort von Gracenotes erwähnten Probleme beim Zitieren kümmern.

146voto

JBallin Punkte 6327

Wenn Sie sich todo Vorkommnisse ( g ), die Groß- und Kleinschreibung nicht berücksichtigen ( i ), und verwenden Sie Begrenzungen, damit es nicht ein Wort innerhalb eines anderen Wortes ist ( \\b ):

re = new RegExp(`\\b${replaceThis}\\b`, 'gi');

Beispiel:

let inputString = "I'm John, or johnny, but I prefer john.";
let replaceThis = "John";
let re = new RegExp(`\\b${replaceThis}\\b`, 'gi');
console.log(inputString.replace(re, "Jack")); // I'm Jack, or johnny, but I prefer Jack.

44voto

Paige Ruten Punkte 164391

Dies:

var txt=new RegExp(pattern,attributes);

ist gleichbedeutend mit diesem:

var txt=/pattern/attributes;

Ver http://www.w3schools.com/jsref/jsref_obj_regexp.asp .

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X