it-swarm.com.de

Wie verwendet man 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 die knappste Möglichkeit ist, dies zu tun. Ich kann jedoch nicht herausfinden, wie eine Variable an einen regulären Ausdruck übergeben wird. Ich kann dies bereits tun, wodurch alle Instanzen von "B" durch "A" ersetzt werden.

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

Aber ich möchte so etwas machen:

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

Aber offensichtlich ersetzt dies nur den Text "replaceThis"... Wie übergebe ich diese Variable an meine Regex-Zeichenfolge?

1202
JC Grubbs

Anstatt die /regex/g -Syntax zu verwenden, können Sie ein neues RegExp -Objekt erstellen:

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

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

"mystring".replace(re, "newstring");
1652
Eric Wendelin

Wie Eric Wendelin sagte, 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 erwarten, dass das Ergebnis "pattern matching regex" ist und den Punkt durch "regex" ersetzt, aber es wird sich herausstellen, dass ...

regexregexregexregexregexregexregexregexregexregexregexregexregexregexregexregexregexregex

Dies liegt daran, dass "." zwar eine Zeichenfolge ist, im RegExp-Konstruktor jedoch immer noch als regulärer Ausdruck interpretiert wird, dh als Zeichen, das keine Zeilenumbrüche enthält, dh als 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");

nachgeben von "pattern matching regex".

195
Gracenotes

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

Wie immer: Verwenden Sie Regex nur, wenn Sie es müssen. Für ein einfaches Ersetzen eines Strings lautet die Redewendung:

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

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

106
bobince

Für alle, die Variablen mit der match -Methode verwenden möchten, hat dies bei mir funktioniert

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

Diese:

var txt=new RegExp(pattern,attributes);

ist gleichbedeutend mit:

var txt=/pattern/attributes;

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

29
Jeremy Ruten

Wenn Sie ALLE Vorkommen abrufen möchten (g), beachten Sie die Groß- und Kleinschreibung (i) und verwenden Sie Grenzen, damit es sich nicht um ein Wort in einem anderen Wort handelt (\\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.
24
JBallin
this.replace( new RegExp( replaceThis, 'g' ), withThis );
19
tvanfosson

Sie möchten den regulären Ausdruck dynamisch erstellen, und hierfür müssen Sie den Konstruktor new RegExp(string) verwenden. Damit der Konstruktor Sonderzeichen buchstäblich behandelt, müssen Sie sie maskieren. In Widget für die automatische Vervollständigung der jQuery-Benutzeroberfläche mit dem Namen $.ui.autocomplete.escapeRegex ist eine Funktion integriert:

[...] Sie können die integrierte Funktion $.ui.autocomplete.escapeRegex verwenden. Es wird ein einzelnes Zeichenfolgenargument benötigt und alle regulären Zeichen werden umgangen, sodass das Ergebnis sicher an new RegExp() übergeben werden kann.

Wenn Sie die jQuery-Benutzeroberfläche verwenden, können Sie diese Funktion verwenden oder ihre Definition kopieren aus 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]"
10
Salman A
String.prototype.replaceAll = function (replaceThis, withThis) {
   var re = new RegExp(replaceThis,"g"); 
   return this.replace(re, withThis);
};
var aa = "abab54..aba".replaceAll("\\.", "v");

Testen Sie mit diesem Werkzeug

9
unigogo
String.prototype.replaceAll = function(a, b) {
    return this.replace(new RegExp(a.replace(/([.?*+^$[\]\\(){}|-])/ig, "\\$1"), 'ig'), b)
}

Testen Sie es wie folgt:

var whatever = 'Some [b]random[/b] text in a [b]sentence.[/b]'

console.log(whatever.replaceAll("[", "<").replaceAll("]", ">"))
5
MetalGodwin

Hier ist eine weitere Implementierung von replaceAll:

    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;
    };
4
scripto

Während Sie dynamisch erstellte RegExp's erstellen können (gemäß den anderen Antworten auf diese Frage), werde ich meinen Kommentar aus einem ähnlichen Beitrag wiederholen : The functional Die Form von String.replace () ist äußerst nützlich und verringert in vielen Fällen den Bedarf an dynamisch erstellten RegExp-Objekten. (Dies ist eine Art Schmerz, da Sie die Eingabe in den RegExp-Konstruktor als Zeichenfolge ausdrücken müssen, anstatt das Schrägstriche/[A-Z] +/RegExp-Literalformat zu verwenden.)

3
Jason S

Und die Coffeescript-Version von Steven Pennys Antwort, da dies das zweithäufigste Google-Ergebnis ist ... auch wenn Kaffee nur aus Javascript besteht und viele Zeichen entfernt wurden ...;)

baz = "foo"
filter = new RegExp(baz + "d")
"food fight".match(filter)[0] // food

und in meinem speziellen Fall

robot.name=hubot
filter = new RegExp(robot.name)
if msg.match.input.match(filter)
  console.log "True!"
3
keen

Um mein Bedürfnis zu befriedigen, eine Variable/alias/function in einen regulären Ausdruck einzufügen, habe ich mir Folgendes ausgedacht:

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

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

dabei ist 'oldre' der ursprüngliche reguläre Ausdruck, in den ich eine Variable einfügen möchte, 'xx' der Platzhalter für diese Variable/Alias ​​/ Funktion und 'yy' der tatsächliche Variablenname, -alias oder -funktion.

3
Alex Li

Sie können indexOf immer wieder verwenden:

String.prototype.replaceAll = function(substring, replacement) {
    var result = '';
    var lastIndex = 0;

    while(true) {
        var index = this.indexOf(substring, lastIndex);
        if(index === -1) break;
        result += this.substring(lastIndex, index) + replacement;
        lastIndex = index + substring.length;
    }

    return result + this.substring(lastIndex);
};

Dies führt nicht zu einer Endlosschleife, wenn die Ersetzung die Übereinstimmung enthält.

1
Ry-

Ihre Lösung ist hier:

Übergebe eine Variable an einen regulären Ausdruck.

Die eine, die ich implementiert habe, besteht darin, den Wert aus einem Textfeld zu nehmen, das Sie ersetzen möchten, und ein anderes ist das Textfeld "Ersetzen durch", den Wert aus dem Textfeld in einer Variablen abzurufen und die Variable auf RegExp zu setzen Funktion weiter zu ersetzen. In meinem Fall, dass ich Jquery verwende, können Sie dies auch nur mit JavaScript tun.

JavaScript-Code:

  var replace =document.getElementById("replace}"); // getting a value from a text field with I want to replace
  var replace_with = document.getElementById("with"); //Getting the value from another text fields with which I want to replace another string.

  var sRegExInput = new RegExp(replace, "g");    
  $("body").children().each(function() {
    $(this).html($(this).html().replace(sRegExInput,replace_with));
  });

Dieser Code wird beim Onclick-Ereignis einer Schaltfläche, Sie können diese in eine Funktion setzen, um sie aufzurufen.

So, jetzt können Sie Variable in Ersetzungsfunktion übergeben.

1
Ajit Hogade

Sie können dies verwenden, wenn $ 1 bei Ihnen nicht funktioniert

var pattern = new RegExp("amman","i");
"abc Amman efg".replace(pattern,"<b>"+"abc Amman efg".match(pattern)[0]+"</b>");
1

Keine dieser Antworten war mir klar. Ich fand schließlich eine gute Erklärung bei http://burnignorance.com/php-programming-tips/how-to-use-a-variable-in-replace-function-of-javascript/

Die einfache Antwort lautet:

var search_term = new RegExp(search_term, "g");    
text = text.replace(search_term, replace_term);

Zum Beispiel:

$("button").click(function() {
  Find_and_replace("Lorem", "Chocolate");
  Find_and_replace("ipsum", "ice-cream");
});

function Find_and_replace(search_term, replace_term) {
  text = $("textbox").html();
  var search_term = new RegExp(search_term, "g");
  text = text.replace(search_term, replace_term);
  $("textbox").html(text);
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<textbox>
  Lorem ipsum Lorem ipsum Lorem ipsum Lorem ipsum Lorem ipsum Lorem ipsum
</textbox>
<button>Click me</button>
0
Paul Jones