Ich möchte eine "String.replaceAll()"-Methode in JavaScript erstellen 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 "B"
mit "A"
ersetzen wird.
"ABABAB".replace(/B/g, "A");
Aber ich möchte etwas wie dies tun:
String.prototype.replaceAll = function(replaceThis, withThis) {
this.replace(/replaceThis/g, withThis);
};
Aber offensichtlich wird dies nur den Text ""replaceThis"`...so wie kann ich diese Variable in meine Regex-Zeichenfolge übergeben?
Anstatt die Syntax /regex/g
zu verwenden, können Sie ein neues RegExp Objekt konstruieren:
var replace = "regex";
var re = new RegExp(replace,"g");
Auf diese Weise können Sie Regex-Objekte dynamisch erstellen. Dann werden Sie tun:
"mystring".replace(re, "newstring");
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 erwarten, dass das Ergebnis "pattern matching regex"
ist, wobei der Punkt durch "regex"
ersetzt wird, aber es'wird sich herausstellen als...
regexregexregexregexregexregexregexregexregexregexregexregexregexregexregexregexregexregex
Dies liegt daran, dass "."
zwar eine Zeichenkette ist, im RegExp-Konstruktor jedoch's immer noch als regulärer Ausdruck interpretiert wird, d.h. als jedes Zeichen ohne Zeilenumbruch, d.h. jedes Zeichen in der Zeichenkette.
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");
ergibt "Mustervergleich regex"
.
"ABABAB".replace(/B/g, "A");
Wie immer: don'verwenden Sie regex nur, wenn Sie es müssen. Für eine einfache Zeichenkettenersetzung lautet das Idiom
'ABABAB'.split('B').join('A')
Dann brauchen Sie sich keine Sorgen über die in Gracenotes's Antwort erwähnten Zitierprobleme zu machen.
Für jeden, der eine Variable mit der Match-Methode verwenden wollte, hat das bei mir funktioniert
var alpha = 'fig';
'food fight'.match(alpha + 'ht')[0]; // fight
Dies:
var txt=new RegExp(pattern,attributes);
ist äquivalent zu diesem:
var txt=/pattern/attributes;
Wenn Sie ALLE Vorkommen (g
) erhalten wollen, achten Sie nicht auf Groß- und Kleinschreibung (i
) und verwenden Sie Grenzen, so dass es't 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.
this.replace( new RegExp( replaceThis, 'g' ), withThis );
Sie möchten den regulären Ausdruck dynamisch aufbauen, und die richtige Lösung dafür ist die Verwendung des neuen RegExp(string)
Konstruktors.
Damit der Konstruktor Sonderzeichen wörtlich behandeln kann, müssen Sie diese maskieren.
Es gibt eine eingebaute Funktion in [jQuery UI autocomplete widget][1] namens $.ui.autocomplete.escapeRegex
:
$.ui.autocomplete.escapeRegex
: >
[...] Sie können die eingebaute
`$.ui.autocomplete.escapeRegex'-Funktion. It'nimmt eine einzelne Zeichenkette
Argument und entkommen alle Regex-Zeichen, so dass das Ergebnis sicher
Übergang zu
neuer RegExp()
.
Wenn Sie jQuery UI verwenden, können Sie diese Funktion verwenden oder ihre Definition [aus dem Quelltext][2] kopieren:
function escapeRegex( value ) {
return value.replace( /[\-\[\]{}()*+?.,\\\^$|#\s]/g, "\\$&" );
}
Und verwenden Sie 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]"
[1]: https://api.jqueryui.com/autocomplete/ [2]: https://github.com/jquery/jquery-ui/blob/master/ui/widgets/autocomplete.js
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][1].
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("]", ">"))
Hier's eine andere ersetzenAlle 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;
};
Und die Coffeescript-Version von Steven Penny's Antwort, da dies # 2 Google-Ergebnis ist.....selbst wenn Kaffee nur Javascript mit einer Menge Zeichen entfernt ist...;)
baz = "foo"
filter = new RegExp(baz + "d")
"food fight".match(filter)[0] // food
und in meinem besonderen Fall
robot.name=hubot
filter = new RegExp(robot.name)
if msg.match.input.match(filter)
console.log "True!"
Um mein Bedürfnis zu befriedigen, eine Variable/Alias/Funktion 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");
wo 'oldre' der ursprüngliche regexp ist, den ich eine Variable einfügen möchte, 'xx' ist der Platzhalter für diese Variable/Alias/Funktion, und 'jj' ist der tatsächliche Variablenname, Alias oder Funktion.
Während Sie dynamisch erstellte RegExp's machen können (wie bei den anderen Antworten auf diese Frage), werde ich meinen Kommentar aus einem [ähnlichen Beitrag][1] wiedergeben: Die funktionale Form von [String.replace()][2] ist äußerst nützlich und reduziert in vielen Fällen den Bedarf an dynamisch erzeugten RegExp-Objekten. (die eine Art Schmerz sind 'denn Sie müssen die Eingabe an den RegExp-Konstruktor als Zeichenkette ausdrücken, anstatt die Schrägstriche /[A-Z]+/ regexp literales Format zu verwenden)
[1]: https://stackoverflow.com/questions/487509/passing-variable-to-a-regexp-in-javascript/488133#488133 [2]: https://developer.mozilla.org/En/Core_JavaScript_1.5_Reference/Global_Objects/String/Replace
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 geht nicht in eine Endlosschleife, wenn die Auswechslung das Spiel enthält.
Ihre Lösung ist hier:
[Übergeben Sie eine Variable an einen regulären Ausdruck.][1]
[1]: (1): http://www.mindfiresolutions.com/How-to-use-a-variable-in-replace-function-of-JavaScript-676.php
Die von mir implementierte Methode besteht darin, den Wert aus einem Textfeld zu nehmen, das Sie ersetzen möchten, und ein anderes ist das "replace with" Textfeld ist, den Wert aus einem Textfeld in einer Variablen erhält und die Variable auf die Funktion RegExp setzt, um sie weiter zu ersetzen. In meinem Fall benutze ich Jquery, Sie können es auch nur mit JavaScript machen.
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 ist auf Onclick-Ereignis einer Schaltfläche, Sie können diesen in eine aufzurufende Funktion einfügen.
Jetzt können Sie also eine Variable in einer Ersetzungsfunktion übergeben.
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>");
Keine dieser Antworten war für mich eindeutig. Unter http://burnignorance.com/php-programming-tips/how-to-use-a-variable-in-replace-function-of-javascript/ fand ich schließlich eine gute Erklärung.
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>