2012-06-29 42 views

cevap

29

exec() senin kadar kibrit değil seti ilk maç için yakalar sadece kümesi dönüyor bekliyoruz. yani - Ne Gerçekten görüyoruz $0 (tüm maç "a") ve $1 (ilk yakalama) 'dir. Tekrarsonraki maç için tutukları almak için diyoruz böylece uzunluğu 2. exec() dizisi arada tasarlanmıştır. MDN Gönderen: Düzenli ifade "g" bayrağı kullanıyorsa

, aynı dizede ardışık eşleşmeleri bulmak için exec yöntemini birden çok kez kullanabilirsiniz. Bunu yaptığınızda, arama normal ifadenin lastIndex özelliğiyle belirtilen str alt dizininde başlar (test ayrıca lastIndex özelliğini de ilerletir).

+2

Btw, tüm maç js olarak '$ &'. – Qtax

+0

İlginç, JS'de böyle bir '' '' '' '' '' '' 'değişkenler olduğunu bile bilmiyordum. Perl'de konuşuyordum. :) İyi bilmek olsa da. –

+2

'MDN' =' + 1' –

19

yerine match kullanabilirsiniz:

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

, 'match' bu durum için ideal bir araçtır, OP ihtiyacı yoktur şartıyla her maçın içinden alt gruplar. – apsillers

+1

Her zaman en az bir eşleşme olması koşuluyla. Aksi takdirde 'match' boş bir dizi yerine 'null' değerini döndürür. – Robert

6

Yalnızca birinci eşleştirme. Uzunluğun iki olmasının nedeni, ilk eşleşmeyi ve ilk eşleşmenin parantezize edilmiş grup bölümünü bulmasıdır. Senin durumunda aynılar.

Bu örneği ele alalım.

ba, a çıktılar. Dizi uzunluğu hala 2, ama neler olup bittiği daha açık. "Ba" tam eşleşmedir. a parantezize ilk gruplama eşleşmesidir. MDN documentation

bu destekler - sadece ilk maç ve içerdiği gruplar döndürülür. Tüm eşleşmeleri bulmak için, mVChr ile belirtilen şekilde match() öğesini kullanırsınız.

3

Kodu:

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

Çıktı:

Nitekim
3 
İlgili konular