Angenommen, ich wollte Folgendes wiederverwendbar machen:
function replace_foo(target, replacement) {
return target.replace("string_to_replace",replacement);
}
Ich könnte so etwas tun:
function replace_foo(target, string_to_replace, replacement) {
return target.replace(string_to_replace,replacement);
}
Mit String-Literalen ist dies einfach genug. Aber was ist, wenn ich mit dem regulären Ausdruck etwas kniffliger werden möchte? Angenommen, ich möchte alles ersetzen, aber string_to_replace
. Instinktiv würde ich versuchen, das oben Gesagte zu erweitern, indem ich etwas tue wie:
function replace_foo(target, string_to_replace, replacement) {
return target.replace(/^string_to_replace/,replacement);
}
Das scheint nicht zu funktionieren. Ich vermute, dass es sich string_to_replace
eher um ein String-Literal als um eine Variable handelt, die einen String darstellt. Ist es möglich, JavaScript-Regexes im laufenden Betrieb mithilfe von Zeichenfolgenvariablen zu erstellen? So etwas wäre toll, wenn es überhaupt möglich wäre:
function replace_foo(target, string_to_replace, replacement) {
var regex = "/^" + string_to_replace + "/";
return target.replace(regex,replacement);
}
quelle
/
Lassen Sie auch bei Verwendung dieses Formulars die Regex-Trennzeichen weg.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 demnew RegExp
Konstruktor aus einer Zeichenfolge heraus tun :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:
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 !(Vier
$
s, weil das selbst eine Ersatzzeichenfolge ist - argh!)Jetzt können Sie das globale Ersetzen von Zeichenfolgen mit RegExp implementieren:
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:
...und das ist alles. Dies ist eine allgemein verständliche Redewendung.
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:
Auch hier könnte eine Aufteilung einfacher sein:
quelle
Wie die anderen gesagt haben, verwenden
new RegExp(pattern, flags)
Sie dies. Es ist erwähnenswert, dass Sie String-Literale an diesen Konstruktor übergeben, sodass jeder Backslash maskiert werden muss. Wenn Sie beispielsweise möchten, dass Ihr Regex mit einem Backslash übereinstimmt, müssen Sie dies sagennew RegExp('\\\\')
, während das Regex-Literal nur sein muss/\\/
. Abhängig davon, wie Sie dies verwenden möchten, sollten Sie vorsichtig sein, Benutzereingaben an eine solche Funktion zu übergeben, ohne eine angemessene Vorverarbeitung (ohne Sonderzeichen usw.). Ohne dies können Ihre Benutzer einige sehr unerwartete Ergebnisse erzielen.quelle
/\b[term]\B/
, aber wenn ich ihn konstruiere, muss ich ihn aufrufennew RegExp("\\b"+ term + "\\B")
. Klein , aber wichtiger Unterschied, und hart , da mit ihm zu erkennen als ein regulären Ausdruck direkt funktioniert wie erwartet.Ja, du kannst.
https://developer.mozilla.org/en/JavaScript/Guide/Regular_Expressions
quelle
Ich denke, ich habe ein sehr gutes Beispiel für das Hervorheben von Text in einer Zeichenfolge (es wird nicht das Register angezeigt, sondern das Register hervorgehoben).
http://jsfiddle.net/cdbzL/1258/
quelle
Eine wirklich einfache Lösung hierfür ist:
Regexes werden überhaupt nicht benötigt
Es scheint auch das schnellste in modernen Browsern zu sein: https://jsperf.com/replace-vs-split-join-vs-replaceall
quelle