2012-06-29 9 views

risposta

29

exec() sta tornando solo l'insieme di cattura per la prima partita, non l'insieme di corrispondenze possibili durante la aspettarsi. Quindi quello che stai vedendo è davvero $0 (tutto il match, "a") e $1 (la prima cattura) - cioè. un array di lunghezza 2. exec() nel frattempo è progettato in modo che si può chiamare di nuovoper ottenere la cattura per la prossima partita. Da MDN:

Se l'espressione regolare utilizza il flag "g", è possibile utilizzare il metodo exec più volte per trovare le corrispondenze successive nella stessa stringa. Quando si esegue questa operazione, la ricerca inizia dalla sottostringa di str specificata dalla proprietà lastIndex dell'espressione regolare (il test avanza anche la proprietà lastIndex).

+2

Btw, l'intera corrispondenza è '$ &' in js. – Qtax

+0

Interessante, non sapevo nemmeno che esistessero tali variabili '' $ '' in JS. Stavo solo parlando in Perl. :) Buono a sapersi, però. –

+2

'MDN' =' + 1' –

19

Si potrebbe utilizzare match invece:

'a a a'.match(/(a)/g).length // outputs: 3 
+2

Anzi, 'match' è lo strumento ideale per questo caso, a condizione che il PO non ha bisogno sottogruppi dall'interno di ogni partita. – apsillers

+1

A condizione che ci sia sempre almeno una corrispondenza. Altrimenti 'match' restituisce' null' invece di un array vuoto. – Robert

6

Si sta abbinando solo il primo a. Il motivo per cui la lunghezza è due è che sta trovando la prima corrispondenza e la parte del gruppo parentesi della prima corrispondenza. Nel tuo caso sono uguali.

considerare questo esempio.

var a = /b(a)/g.exec('ba ba ba '); 
alert(a); 

Emissione ba, a. La lunghezza dell'array è ancora 2, ma è più ovvio cosa sta succedendo. "ba" è la partita completa. a è la prima corrispondenza di raggruppamento tra parentesi.

Il MDN documentation supporta questa - che i gruppi solo la prima partita e contenuti vengono restituiti. Per trovare tutte le partite, devi usare match() come dichiarato da mVChr.

3

Codice:

alert('a a a'.match(/(a)/g).length); 

uscita:

3