Mit String-Literalen ist dies einfach genug.
Nicht wirklich! Das Beispiel ersetzt nur das erste Auftreten von string_to_replace. In der Regel möchten Sie alle Vorkommen ersetzen. In diesem Fall müssen Sie die Zeichenfolge in eine globale ( /.../g) RegExp konvertieren . Sie können dies mit dem new RegExpKonstruktor aus einer Zeichenfolge heraus tun :
new RegExp(string_to_replace, 'g')
Das Problem dabei ist, dass sich alle Regex-Sonderzeichen im Zeichenfolgenliteral auf ihre besondere Weise verhalten, anstatt normale Zeichen zu sein. Sie müssten ihnen einen Backslash-Escape geben, um das zu beheben. Leider gibt es keine integrierte Funktion, um dies für Sie zu tun. Hier ist eine, die Sie verwenden können:
function escapeRegExp(s) {
return s.replace(/[-/\\^$*+?.()|[\]{}]/g, '\\$&')
}
Beachten Sie auch, dass bei Verwendung von RegExp in replace()die Ersatzzeichenfolge jetzt auch ein Sonderzeichen hat $. Dies muss auch vermieden werden, wenn Sie ein Literal $in Ihrem Ersatztext haben möchten !
function escapeSubstitute(s) {
return s.replace(/\$/g, '$$$$');
}
(Vier $s, weil das selbst eine Ersatzzeichenfolge ist - argh!)
Jetzt können Sie das globale Ersetzen von Zeichenfolgen mit RegExp implementieren:
function replace_foo(target, string_to_replace, replacement) {
var relit= escapeRegExp(string_to_replace);
var sub= escapeSubstitute(replacement);
var re= new RegExp(relit, 'g');
return target.replace(re, sub);
}
Was für ein Schmerz. Glücklicherweise gibt es einen schnelleren Weg, wenn Sie nur eine gerade Saite ohne zusätzliche Teile von Regex ersetzen möchten:
s.split(string_to_replace).join(replacement)
...und das ist alles. Dies ist eine allgemein verständliche Redewendung.
Angenommen, ich möchte alles außer string_to_replace ersetzen
Was bedeutet das, dass Sie alle Textabschnitte ersetzen möchten, die nicht an einer Übereinstimmung mit der Zeichenfolge teilnehmen? Ein Ersatz mit ^sicherlich nicht, denn dies ^bedeutet ein Zeichenfolgenstart-Token, keine Negation. ^ist nur eine Negation in []Zeichengruppen. Es gibt auch negative Lookaheads (?!...), aber es gibt Probleme damit in JScript, daher sollten Sie dies generell vermeiden.
Sie können versuchen, "alles bis zu" der Zeichenfolge abzugleichen und mithilfe einer Funktion alle leeren Abschnitte zwischen übereinstimmenden Zeichenfolgen zu verwerfen:
var re= new RegExp('(.*)($|'+escapeRegExp(string_to_find)+')')
return target.replace(re, function(match) {
return match[1]===''? match[2] : replacement+match[2];
});
Auch hier könnte eine Aufteilung einfacher sein:
var parts= target.split(string_to_match);
for (var i= parts.length; i-->0;)
if (parts[i]!=='')
parts[i]= replacement;
return parts.join(string_to_match);
/Lassen Sie auch bei Verwendung dieses Formulars die Regex-Trennzeichen weg.