2012-06-29 31 views

Trả lời

29

exec() đang trở lại chỉ có bộ ảnh chụp cho trận đấu đầu tiên, không phải là tập hợp các trận đấu như bạn chờ đợi. Vì vậy, những gì bạn đang thực sự nhìn thấy là $0 (toàn bộ kết quả "a") và $1 (ảnh chụp đầu tiên) - tức là. một mảng chiều dài 2. exec() trong khi đó được thiết kế để bạn có thể gọi lại là một lần nữa để nhận các ảnh chụp cho kết quả phù hợp tiếp theo. Từ MDN:

Nếu cụm từ thông dụng của bạn sử dụng cờ "g", bạn có thể sử dụng phương pháp exec nhiều lần để tìm các kết quả liên tiếp trong cùng một chuỗi. Khi bạn làm như vậy, tìm kiếm bắt đầu tại chuỗi con của str được chỉ định bởi thuộc tính lastIndex của biểu thức chính quy (kiểm tra cũng sẽ tiến hành thuộc tính lastIndex).

+2

Btw, toàn bộ kết quả là '$ &' trong js. – Qtax

+0

Thú vị, tôi thậm chí không biết có những biến '' $ '' trong JS. Tôi vừa nói ở Perl. :) Tốt để biết, mặc dù. –

+2

'MDN' =' + 1' –

19

Bạn có thể sử dụng thay vì match:

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

Thật vậy, 'match' là công cụ lý tưởng cho các trường hợp này, với điều kiện OP không cần các nhóm con từ trong mỗi trận đấu. – apsillers

+1

Được cung cấp luôn có ít nhất một trận đấu. Ngược lại 'match' trả về' null' thay vì một mảng trống. – Robert

6

Bạn chỉ khớp cụm từ đầu tiên a. Lý do độ dài là hai là nó đang tìm kiếm trận đấu đầu tiên và phần nhóm được kết hợp của trận đấu đầu tiên. Trong trường hợp của bạn, chúng giống nhau.

Hãy xem xét ví dụ này.

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

Kết quả đầu ra ba, a. Chiều dài mảng vẫn là 2, nhưng rõ ràng hơn những gì đang diễn ra. "ba" là trận đấu đầy đủ. a là kết hợp nhóm được nhóm dấu ngoặc đơn đầu tiên.

MDN documentation hỗ trợ điều này - chỉ trả lại kết quả khớp đầu tiên và nhóm được chứa. Để tìm tất cả các kết quả phù hợp, bạn sẽ sử dụng match() như mVChr đã nêu.

3

Code:

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

Output:

3 
Các vấn đề liên quan