Warum 'ABC'.replace (' B ',' $ `') AAC gibt

70

Warum wird dieser Code AACnicht erwartet gedruckt A$`C?

console.log('ABC'.replace('B', '$`'));

==>

AAC

Und wie kann man das erwartete Ergebnis erzielen?

exebook
quelle
developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… aber dies ist nicht standardmäßige fdature
anubhava
6
@anubhava: Diese Funktion ist sehr Standard. Die in den von Ihnen verknüpften Dokumenten beschriebene Eigenschaft ist nicht Standard.
Bergi
2
@anubhava: ​RegExp.$`​Eigenschaft ist nicht Standard. ​$`​in der Ersatzzeichenfolge ist Standard.
nhahtdh
1
Folgefrage : Weiß jemand, warum das Entkommen $mit einem Backslash \\ nicht das richtige Ergebnis liefert (dh "\ $` ")?
fspinnenhirn
2
@greenSocksRock Weil es aus irgendeinem Grund $stattdessen um eine Sekunde maskiert wird .
OJFord

Antworten:

71
console.log('ABC'.replace('B', "$$`"));

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace

Um $ einzufügen, müssen Sie $$ übergeben, weil $ `:

Fügt den Teil der Zeichenfolge ein, der dem übereinstimmenden Teilstring vorausgeht.

Andere Muster:

Geben Sie hier die Bildbeschreibung ein

Geige:

http://jsfiddle.net/8kou1z3q/

Es gibt auch noch mehr Dinge auf dem Referenzlink, den ich oben gepostet habe. Wenn Sie immer noch Probleme haben oder Zweifel haben, dass Sie dort wahrscheinlich eine Antwort finden, wurde der Screenshot oben von dem Link genommen, der am Anfang der Antwort gepostet wurde.

BEARBEITEN:

Meiner Meinung nach ist es erwähnenswert, dass jedes Muster, das nicht mit dem oben genannten übereinstimmt, nicht maskiert werden muss und daher $auch nicht maskiert werden muss. Dieselbe Geschichte passiert mit $AAA.

In den obigen Kommentaren fragte ein Benutzer, warum Sie $ mit einem anderen $ "entkommen" müssen: Obwohl ich mir nicht wirklich sicher bin, denke ich, dass es sich auch lohnt, auf das, was wir oben gesagt haben, auf ein ungültiges Muster hinzuweisen wird nicht interpretiert , daher denke ich (und vermute an dieser Stelle), dass $$ ein ganz besonderer Fall ist, da er die Fälle abdeckt, in denen Sie die Übereinstimmung durch ein Dollarzeichen ersetzen müssen, gefolgt von einem "mustergesperrten". Zeichen, wie das Häkchen (`) als Beispiel (oder wirklich das & als anderes).

In jedem anderen Fall muss das Dollarzeichen jedoch nicht maskiert werden , daher ist es wahrscheinlich sinnvoll, dass sie beschlossen haben, eine solche spezifische Regel zu erstellen, sonst hätten Sie dem Dollar überall sonst entkommen müssen (und ich denke das hätte einen Einfluss auf jedes String-Objekt haben können, denn das würde bedeuten, dass selbst in var a = "hello, $ hey this one is a dollar";dir das entkommen müsste $).

Wenn Sie immer noch interessiert sind und mehr lesen möchten, überprüfen Sie bitte auch Folgendes:

http://www.regular-expressions.info/javascript.html#replace

Spielen Sie mit mehr Fällen:

http://jsfiddle.net/8kou1z3q/3/

briosheje
quelle
46

Im Dollar hat replacementdas $Dollarzeichen eine besondere Bedeutung und wird verwendet, wenn Daten aus dem Match im verwendet werden sollen replacement.

MDN: String.prototype.replace (): Angabe eines Strings als Parameter

$$ Fügt ein "$" ein.
$ `Fügt den Teil der Zeichenfolge ein, der der übereinstimmenden Teilzeichenfolge vorausgeht.

Solange das $nicht zu einer Kombination führt, die eine besondere Bedeutung hat, wird es nur als reguläres Zeichen behandelt. Sie sollten es jedoch immer als $$Ersatz schreiben, da es sonst in Zukunft möglicherweise fehlschlägt, wenn eine neue $xKombination hinzugefügt wird.

t.niese
quelle
2
$ Zeichen allein verursacht dieses Verhalten nicht, nur Dollar + Back Tick Kombination
Exebook
1
@exebook sicher alleine wird es kein Problem sein. Trotzdem $hat das eine besondere Bedeutung. Ähnlich wie beim - (Unterschied zwischen [a-f]und [af-])
t.niese