2010-07-13 14 views
33

Estoy leyendo el libro de Sitepoints 2007 "Simplemente Javascript" y encontré un código que simplemente no puedo entender.

Es el siguiente código:

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

La primera llamada al método replace es lo que me desconcierta, no entiendo donde el valor "$ 1" viene ni lo que significa. Me gustaría pensar que la llamada debe reemplazar el patrón encontrado con "".

Respuesta

51

Cada par de paréntesis ( ... ) donde el primer carácter no es un ? * es un "grupo de captura", que sitúa su resultado en $1, $2, $3, etc, que se pueden utilizar en el patrón de sustitución.

También puede ver lo mismo que \1, \2, \3 en otros motores de expresiones regulares, (o incluso en la expresión original a veces, por la repetición)

Estas son llamadas "referencias hacia atrás", debido a que generalmente remiten a (una parte anterior) en la expresión.

(* El ? indica diversas formas de comportamiento especial, incluyendo un grupo no captura que es (?: ... ) y simplemente grupos sin capturar.)


En el ejemplo específico, el $ 1 será el grupo (^|) que es "posición del inicio de la cadena (ancho cero), o un carácter de espacio único".

Así que al reemplazar toda la expresión con eso, básicamente está eliminando la variable theClass y potencialmente un espacio después de ella. (La expresión de cierre (|$) es la inversa - un espacio o la posición final de cadena - y puesto que no se utiliza su valor, podría haber sido no capturar con (?: |$) en su lugar.)


Esperamos que esto explica todo muy bien - y mucho yo sé si quieres más información.

Además, éstas son algunas de seguir leyendo desde el sitio regular-expressions.info:

+0

Gracias, está claro ahora. Tuve un pequeño problema para entender lo que quería decir con "cada par de paréntesis", pero eso se aplica al patrón de expresiones regulares.Si el patrón de expresiones regulares contiene un par de paréntesis, entonces es un grupo de captura. –

7

$ 1 es una retro-referencia. Será reemplazado por lo que sea que el primer grupo coincidente (conjunto de paréntesis) en su expresión regular coincida.

+0

En este caso, $ 1 no será nada (si el primer grupo coincide con el carácter 0 de inicio de línea) o un espacio (si el primer grupo coincide con un espacio)) –

+1

No, es ** no ** llamada referencia. Se llama un "patrón de reemplazo especial". –

Cuestiones relacionadas