wake-up-neo.com

Javascript Regex: Wie füge ich eine Variable in einen regulären Ausdruck ein?

Also zum Beispiel:

function(input){
    var testVar = input;
    string = ...
    string.replace(/ReGeX + testVar + ReGeX/, "replacement")
}

Aber das funktioniert natürlich nicht:) Gibt es eine Möglichkeit, dies zu tun?

154
Adam
var regex = new RegExp("ReGeX" + testVar + "ReGeX");
...
string.replace(regex, "replacement");

Aktualisieren

In einigen Kommentaren ist es wichtig zu beachten, dass Sie escape die variable verwenden möchten, wenn potenziell schädlicher Inhalt vorhanden ist (z. B., dass die Variable aus Benutzereingaben stammt).

216
Jason McCreary

Sie können das RegExp-Objekt verwenden:

var regexstring = "whatever";
var regexp = new RegExp(regexstring, "gi");
var str = "whateverTest";
var str2 = str.replace(regexp, "other");
document.write(str2);

Dann können Sie regexstring auf beliebige Weise konstruieren. 

Sie können mehr darüber lesen hier .

69
steinar

Um einen regulären Ausdruck aus einer Variablen in JavaScript zu erstellen, müssen Sie den Konstruktor RegExp mit einem String-Parameter verwenden.

function reg(input) {
    var flags;
    //could be any combination of 'g', 'i', and 'm'
    flags = 'g';
    return new RegExp('ReGeX' + input + 'ReGeX', flags);
}

natürlich ist dies ein sehr naives Beispiel. Es wird davon ausgegangen, dass input für einen regulären Ausdruck ordnungsgemäß geschützt wurde. Wenn Sie sich mit Benutzereingaben beschäftigen oder einfach nur Sonderzeichen zuordnen möchten, müssen Sie die Sonderzeichen mit Escapezeichen versehen :

function regexEscape(str) {
    return str.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&')
}

function reg(input) {
    var flags;
    //could be any combination of 'g', 'i', and 'm'
    flags = 'g';
    input = regexEscape(input);
    return new RegExp('ReGeX' + input + 'ReGeX', flags);
}
29
zzzzBov

Sie können regulären Ausdruck immer als Zeichenfolge angeben, d. H. "ReGeX" + testVar + "ReGeX". Möglicherweise müssen Sie einige Zeichen innerhalb der Zeichenfolge mit einem Escape-Zeichen versehen (z. B. in Anführungszeichen). In den meisten Fällen ist das jedoch gleichwertig.

Sie können auch RegExp constructor verwenden, um Flags in ( siehe docs ) zu übergeben.

6
Nikita Rybak

wenn Sie es6 template literals verwenden sind eine Option ...

string.replace(new RegExp(`ReGeX${testVar}ReGeX`), "replacement")
3
shunryu111

akzeptierte Antwort funktioniert bei mir nicht und folgt nicht MDN-Beispiele

siehe den Abschnitt 'Beschreibung' im obigen Link

Ich würde mit dem folgenden gehen, es funktioniert für mich:

let stringThatIsGoingToChange = 'findMe';
let flagsYouWant = 'gi' //simple string with flags
let dynamicRegExp = new RegExp(`${stringThatIsGoingToChange}`, flagsYouWant)

// that makes dynamicRegExp = /findMe/gi
2

Es ist nur erforderlich, zuerst die Zeichenfolgenvariable vorzubereiten und sie dann in RegEx zu konvertieren.

zum Beispiel:

Sie möchten minLength und MaxLength mit der Variablen zu RegEx hinzufügen:

function getRegEx() {
    const minLength = "5"; // for exapmle: min is 5
    const maxLength = "12"; // for exapmle: man is 12

    var regEx = "^.{" + minLength + ","+ maxLength +"}$"; // first we make a String variable of our RegEx
    regEx = new RegExp(regEx, "g"); // now we convert it to RegEx

    return regEx; // In the end, we return the RegEx
}

wenn Sie nun den Wert von MaxLength oder MinLength ändern, ändert sich dies in allen RegExs.

Ich hoffe, nützlich zu sein. Tut mir auch leid wegen meinem Englisch.

1

Hier ist eine ziemlich nutzlose Funktion, die Werte zurückgibt, die von bestimmten Zeichen umschlossen sind. :)

jsfiddle: https://jsfiddle.net/squadjot/43agwo6x/

function getValsWrappedIn(str,c1,c2){
    var rg = new RegExp("(?<=\\"+c1+")(.*?)(?=\\"+c2+")","g"); 
    return str.match(rg);
    }

var exampleStr = "Something (5) or some time (19) or maybe a (thingy)";
var results =  getValsWrappedIn(exampleStr,"(",")")

// Will return array ["5","19","thingy"]
console.log(results)
1
Jakob Sternberg

Sie können reguläre Ausdrücke in JS auf zwei Arten erstellen: 

  1. Verwenden des regulären Ausdrucksliteral - /ab{2}/g
  2. Verwenden des Konstruktors für reguläre Ausdrücke - new RegExp("ab{2}", "g")

Literale für reguläre Ausdrücke sind konstant und können nicht mit Variablen verwendet werden. Dies könnte mit dem Konstruktor erreicht werden. Die Struktur des RegEx-Konstruktors lautet 

new RegExp(regularExpressionString, modifiersString)

Sie können Variablen als Teil von regularExpressionString einbetten. Zum Beispiel, 

var pattern="cd"
var repeats=3
new RegExp(`${pattern}{${repeats}}`, "g") 

Dies wird mit jeder Erscheinung des Musters cdcdcd übereinstimmen. 

0
Ben Carp