Qu'est-ce que \\ $ & in "str.replace (specials," \\ $ & ")" signifie?

Je me réfère au code de remplacement de chaîne insensible à Case dans JavaScript? :

RegExp.escape = function(str) { var specials = new RegExp("[.*+?|()\\[\\]{}\\\\]", "g"); // .*+?|()[]{}\ return str.replace(specials, "\\$&"); } 

Qu'est-ce que \\$& mean?

Je pense que \\ échappe au caractère \ . Alors $& , j'ai pensé que cela devrait être $1 pour égaler le 1er match? Tho $1 ne fonctionne pas correctement

$& Représente la chaîne (sub) entière correspondant à la regex, indépendamment des groupes de capture. Le résultat de remplacement que vous obtenez est que chaque correspondance de votre chaîne soit échappée par une barre oblique invariable (représentée par \\ ). Étant donné que le regex utilisé ici se compose uniquement d'une classe de caractères, "chaque correspondance" se réfère à chaque métacaracter répertorié dans la classe de caractères qui correspond.

Par exemple, la chaîne regex [abc] sera remplacée par \[abc\] :

  • [ Est apparié tel qu'il se produit dans la classe de caractères. Représenté par $& , remplacé par \[

  • a , b et c ne sont pas des métacaractères dans la classe de caractères, donc ils sont ignorés

  • ] Correspond à la classe de caractères. Représenté par $& , remplacé par \]

$& Est la correspondance entière, qui dans l'exemple est quel que soit le caractère spécial correspondant. $1 ne fonctionne pas car il n'y a pas de groupe (...) dans le regex (bien que si vous avez ajouté des parenthèses autour des crochets, cela fonctionnerait également).

Oui, le premier '\' échappe à l'autre (généralement une barre oblique inverse est utilisée conjointement avec le caractère suivant pour lui donner une signification particulière, afin d'obtenir une barre oblique invariable qu'il faut échapper à l'aide d'une autre barre oblique invariable).

Ce regex n'utilise pas un groupe de capture. Apparemment, il utilise une variable regex commune:

$& returns the entire matched string (some systems its $0)
Dans ce cas, il correspond simplement à 1 caractère à la fois équivalent à s/[.*+?|()\[\]{}\\]/\\$&/g

Façon obscure: dans Perl il existe une fonction appelée quotemeta ("votre chaîne") qui fait cela
Ou il peut être intégré dans le regex avec \ Q. J'aime Perl.

En guise de note, il aurait peut-être laissé tomber la carret et peut-être, mais pas sûr, le $
Le fait qu'il n'y ait pas de méthode intégrée ou en ligne pourrait être une mauvaise chose. Et il faut réfléchir aux métachars qui échappent, car les fragments de regex peuvent être problématiques.