let str = '$$double_dollars$$' console.log(str.replace('$$double_dollars$$', '$$no_double_dollars$$')); // => $no_double_dollars$ // expected $$no_double_dollars$$
Pourquoi cela se produit-il? Comment contourner ce bug?
3 Réponses :
Consultez la documentation pour passer une chaîne de remplacement à remplacer
.
$
est un caractère spécial. Pour exprimer un $
littéral, utilisez $$
.
let str = '$$double_dollars$$' console.log(str.replace('$$double_dollars$$', '$$$$result$$$$'));
Selon la documentation MDN pour < code> String.prototype.replace (comme l'indique @Alex), il existe une liste de modèles spéciaux qui sont évalués en conséquence et l'un d'eux est celui que vous utilisez.
Le modèle spécial est le suivant:
$$
insère un $
Consultez la documentation MDN < / a> pour la liste complète des modèles spéciaux.
Et comme l'a commenté @ H.Figueiredo, vous pouvez échapper aux signes dollar ou suivre l'une des réponses affichées quelques secondes après cette réponse.
Voir: MDN - Chaîne .prototype.replace # Spécifier une fonction comme paramètre
La chaîne de remplacement peut inclure les modèles de remplacement spéciaux suivants:
let str = '$$double_dollars$$' console.log(str.replace('$$double_dollars$$', '$$$$yes_double_dollars$$$$')); // => $$yes_double_dollars$$
Pattern Inserts $$ Inserts a "$". $& Inserts the matched substring. $` Inserts the portion of the string that precedes the matched substring. $' Inserts the portion of the string that follows the matched substring. $n Where n is a positive integer less than 100, inserts the nth parenthesized submatch string, provided the first argument was a RegExp object. Note that this is 1-indexed.
Je suis à peu près sûr que str.replace interprète $ a un caractère spécial d'expression régulière ($ signifie que la chaîne doit commencer par ce qui précède $)
Lisez developer.mozilla.org/en-US / docs / Web / JavaScript / Reference /…
Contourner ce problème pourrait être d'échapper au signe $ (en s'assurant qu'il n'est pas interprété comme un caractère spécial), quelque chose comme "\ $ \ $ double_dollars \ $ \ $"
str.replace ('$$ double_dollars $$', '$$$$ still_double_dollars $$$$');
@ H.Figueiredo Oui,
$
est un caractère spécial RegExp, mais il n'y a pas de RegExp dans la question.@Teemu String.replace utilisera un RegExp s'il est fourni, donc oui si Javascript considère: remplacer (quelque chose) que "quelque chose" est un RegExp, alors il y aura RegExp dans la question.
@ H.Figueiredo JavaScript ne considère pas que "quelque chose" est un RegExp, si une chaîne a été fournie. C'est une chaîne et elle n'est pas implicitement convertie en RegExp. " [Une chaîne] est traitée comme une chaîne verbatim et n'est pas interprétée comme une expression régulière ".
@Teemu vous avez raison! Je pensais que Javascript interprétait la chaîne comme un littéral RegExp, mon mauvais. (Je considérerais toujours ce comportement comme similaire à RegExp, étant donné que $ sélectionne une partie de la correspondance)