Frage Wie verwenden Sie eine Variable in einem regulären Ausdruck?


Ich möchte eine String.replaceAll () -Methode in JavaScript erstellen und ich denke, dass die Verwendung einer RegEx wäre die knappe Art, es zu tun. Ich kann jedoch nicht herausfinden, wie man eine Variable in eine RegEx übergibt. Ich kann das schon machen, was alle Instanzen von "B" durch "A" ersetzt.

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

Aber ich möchte so etwas machen:

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

Aber das ersetzt natürlich nur den Text "replaceThis" ... also wie gebe ich diese Variable an meine RegEx-Zeichenfolge weiter?


980
2018-01-30 00:11


Ursprung


Antworten:


Anstatt das zu verwenden /regex/g Syntax, können Sie eine neue konstruieren RegExp Objekt:

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

Sie können auf diese Weise reguläre Objekte dynamisch erstellen. Dann wirst du tun:

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

1379
2018-01-30 00:15



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

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

Dies ergibt "regex matching .". Es wird jedoch fehlschlagen, wenn str1 ist ".". Sie würden das Ergebnis erwarten "pattern matching regex", Ersetzen der Periode mit "regex"aber es wird sich herausstellen ...

regexregexregexregexregexregexregexregexregexregexregexregexregexregexregexregexregexregex

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

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

Dann können Sie tun:

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

nachgebend "pattern matching regex".


167
2018-01-30 01:02



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

Wie immer: Regex nicht verwenden, außer Sie 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 Gracenotes Antwort erwähnten Probleme kümmern.


83
2018-02-01 03:43



Für alle, die Variable mit dem verwenden möchten Spiel Methode, das hat für mich funktioniert

var alpha = 'fig';
'food fight'.match(alpha + 'ht')[0]; // fight

27
2017-11-28 15:32



Dies:

var txt=new RegExp(pattern,attributes);

entspricht dem:

var txt=/pattern/attributes;

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


20
2018-01-30 00:19



this.replace( new RegExp( replaceThis, 'g' ), withThis );

14
2018-01-30 00:16



String.prototype.replaceAll = function (replaceThis, withThis) {
   var re = new RegExp(replaceThis,"g"); 
   return this.replace(re, withThis);
};
var aa = "abab54..aba".replaceAll("\\.", "v");

Test damit Werkzeug 


9
2018-02-01 09:14



Sie möchten den regulären Ausdruck dynamisch erstellen und hierfür die richtige Lösung verwenden new RegExp(string) Konstrukteur. Damit Konstruktoren Sonderzeichen behandeln können buchstäblichDu musst ihnen entkommen. Es gibt eine eingebaute Funktion in jQuery UI-Autocomplete-Widget namens $.ui.autocomplete.escapeRegex:

[...] können Sie das eingebaute nutzen    $.ui.autocomplete.escapeRegex Funktion. Es wird eine einzelne Zeichenfolge benötigt   streiten Sie alle Regex-Zeichen und machen Sie das Ergebnis sicher   übergeben an new RegExp().

Wenn Sie jQuery UI verwenden, können Sie diese Funktion verwenden oder ihre Definition kopieren von der Quelle:

function escapeRegex(value) {
    return value.replace( /[\-\[\]{}()*+?.,\\\^$|#\s]/g, "\\$&" );
}

Und benutze es so:

"[z-a][z-a][z-a]".replace(new RegExp(escapeRegex("[z-a]"), "g"), "[a-z]");
//            escapeRegex("[z-a]")       -> "\[z\-a\]"
// new RegExp(escapeRegex("[z-a]"), "g") -> /\[z\-a\]/g
// end result                            -> "[a-z][a-z][a-z]"

7
2017-09-14 19:55



Während Sie dynamisch erstellte RegExp's erstellen können (wie bei den anderen Antworten auf diese Frage), werde ich meinen Kommentar von a wiederholen ähnlicher Beitrag: Die funktionelle Form von String.replace () ist äußerst nützlich und reduziert in vielen Fällen die Notwendigkeit dynamisch erstellter RegExp-Objekte. (Das ist eine Art von Schmerz, weil Sie die Eingabe in den RegExp-Konstruktor als Zeichenfolge ausdrücken müssen, anstatt die Schrägstriche / [A-Z] + / regexp-Literalformat zu verwenden)


3
2018-01-30 01:02



Hier ist eine weitere replaceAll-Implementierung:

    String.prototype.replaceAll = function (stringToFind, stringToReplace) {
        if ( stringToFind == stringToReplace) return this;
        var temp = this;
        var index = temp.indexOf(stringToFind);
        while (index != -1) {
            temp = temp.replace(stringToFind, stringToReplace);
            index = temp.indexOf(stringToFind);
        }
        return temp;
    };

3
2018-05-08 10:30



Um meine Notwendigkeit zu erfüllen, eine Variable / einen Alias ​​/ Funktion in einen Regulären Ausdruck einzufügen, habe ich Folgendes gefunden:

oldre = /xx\(""\)/;
function newre(e){
    return RegExp(e.toString().replace(/\//g,"").replace(/xx/g, yy), "g")
};

String.prototype.replaceAll = this.replace(newre(oldre), "withThis");

wo "oldre" ist die ursprüngliche Regexp, die ich eine Variable einfügen möchte, 'xx' ist der Platzhalter für diese Variable / Alias ​​/ Funktion, und 'yy' ist der tatsächliche Variablenname, Alias ​​oder die Funktion.


3
2018-06-05 04:22