2010-07-13 18 views
33

Sto leggendo il libro 2007 di Sitepoints "Simply Javascript" e ho riscontrato un codice che non riesco a capire.

E 'il seguente codice:

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

La prima chiamata al metodo replace è quello che mi lascia perplesso, non capisco dove il valore "$ 1" viene e che cosa significa. Vorrei pensare a che la chiamata dovrebbe sostituire il modello trovato con "".

risposta

51

Ogni coppia di parentesi ( ... ) in cui il primo carattere non è un ? * è un "gruppo di cattura", che pone il suo risultato in $1, $2, $3, ecc, che possono essere utilizzati nel modello di sostituzione.

Si potrebbe anche vedere la stessa cosa di \1, \2, \3 in altri motori di regex, (o anche nell'espressione originale a volte, per la ripetizione)

Questi sono chiamati "backreference", perché in genere rimandano a (una prima) parte dell'espressione.

(* L'? indica le varie forme di comportamento speciale, tra cui un gruppo non-cattura, che è (?: ... ) e semplicemente gruppi senza cattura.)


Nel tuo esempio specifico, il $ 1 sarà il gruppo (^|) che è "posizione dell'inizio della stringa (larghezza zero) o di un singolo carattere di spazio".

Quindi sostituendo l'intera espressione con quella, in pratica stai rimuovendo la variabile theClass e potenzialmente uno spazio dopo di essa. (L'espressione di chiusura (|$) è l'inverso - uno spazio o la posizione finale della stringa - e dal momento che il suo valore non viene utilizzato, avrebbe potuto essere non catturare con (?: |$) invece.)


Speriamo che questo spiega tutto ok - lasciare so se vuoi altre informazioni.

Inoltre, ecco qualche ulteriore lettura dal sito regular-expressions.info:

+0

Grazie, ora è chiaro. Ho avuto un piccolo problema a capire cosa intendevi per "ogni coppia di parentesi", ma ciò si applica al modello regex.Se il modello regex contiene una coppia di parentesi, allora è un gruppo che cattura. –

7

$ 1 è un riferimento. Verrà sostituito da qualunque sia il primo gruppo corrispondente (insieme di parentesi) nelle tue espressioni regolari.

+0

In questo caso $ 1 non sarà nulla (se il primo gruppo corrisponde al carattere di inizio 0 della larghezza 0) o uno spazio (se il primo gruppo corrisponde a uno spazio). –

+1

No, è ** non ** chiamato un riferimento posteriore. Si chiama "modello di sostituzione speciale". –

Problemi correlati