2010-07-13 8 views
33

Je suis en train de lire le livre "Simply Javascript" de Sitepoints 2007 et j'ai rencontré un code que je ne peux pas comprendre.

Il est le code suivant:

Core.removeClass = function(target, theClass) 
{ 
    var pattern = new RegExp("(^|)" + theClass + "(|$)"); 
    target.className = target.className.replace(pattern, "$1"); 
    target.className = target.className.replace(/ $/, ""); 
}; 

Le premier appel à la méthode replace est ce qui me casse-têtes, je ne comprends pas la valeur « $ 1 » provient ou ce que cela signifie. Je voudrais penser que l'appel devrait remplacer le motif trouvé par "".

Répondre

51

Chaque paire de parenthèses ( ... ) où le premier caractère est pas un ? * est un « groupe de capture », qui place son résultat dans $1, $2, $3, etc qui peut être utilisé dans le modèle de remplacement.

Vous pouvez également voir la même chose que \1, \2, \3 dans d'autres moteurs regex, (ou bien dans l'expression originale parfois, pour la répétition)

Ceux-ci sont appelés « arrières », parce qu'ils font généralement référence retour à (une partie antérieure) de l'expression.

(* Le ? indique diverses formes de comportement particulier, y compris un groupe non-capture qui est (?: ... ) et simplement des groupes sans capturer.)


Dans votre exemple précis, le 1 $ sera le groupe (^|) qui est "position du début de la chaîne (largeur nulle), ou un espace unique". Donc, en remplaçant l'expression entière par cela, vous supprimez la variable theClass et éventuellement un espace après celle-ci. (L'expression de fermeture (|$) est l'inverse - un espace ou la position de fin de chaîne - et puisque sa valeur est utilisée, aurait pu être non-capture avec (?: |$) à la place.)


Espérons que cela explique tout va bien - laisser Je sais si tu veux plus d'infos.

Aussi, voici un peu de lecture plus loin du site regular-expressions.info:

+0

Merci, c'est clair maintenant. J'ai eu un peu de difficulté à comprendre ce que vous vouliez dire par "chaque paire de parenthèses", mais cela s'applique au motif regex.Si le motif regex contient une paire de parenthèses, il s'agit d'un groupe de capture. –

7

$ 1 est une référence arrière. Il sera remplacé par le premier groupe correspondant (ensemble de parenthèses) dans vos correspondances regex.

+0

Dans ce cas, $ 1 ne sera rien (si le premier groupe correspond au caractère de début de ligne 0-width) ou un espace (si le premier groupe correspond à un espace). –

+1

Non, ce n'est pas ** ** appelé une référence arrière. C'est ce qu'on appelle un "modèle de remplacement spécial". –