2012-01-18 38 views

Trả lời

24

Để workaround vấn đề, bạn có thể loại bỏ các g cờ hoặc thiết lập lại lastIndex như trong

var reg = /a/g; 
console.log(reg.test("a")); 
reg.lastIndex = 0; 
console.log(reg.test("a")); 

vấn đề nảy sinh vì test được dựa trên exec trông để biết thêm trận đấu sau khi người đầu tiên nếu được thông qua cùng một chuỗi và cờ g có mặt.

15.10.6.3RegExp.prototype.test(string) # Ⓣ Ⓡ

Các bước sau đây được thực hiện:

  1. Hãy trận đấu là kết quả của việc đánh giá (15.10.6.2) thuật toán RegExp.prototype.exec khi RegExp đối tượng này sử dụng chuỗi làm đối số.
  2. Nếu khớp với không phải là null, sau đó trả lại true; người khác trả lại false.

Phần chính của exec là bước 6 của 15.10.6.2:

6. Hãy để thế giới là kết quả của cách gọi [[Nhận]] phương pháp nội bộ của R với lập luận "toàn cầu".
7. Nếu toàn cầu là sai, sau đó để cho i = 0.

Khi i không reset về 0, sau đó exec (và do đó test) không bắt đầu tìm kiếm ở phần đầu của chuỗi.

này rất hữu ích cho exec vì bạn có thể lặp để xử lý mỗi trận đấu:

var myRegex = /o/g; 
var myString = "fooo"; 
for (var match; match = myRegex.exec(myString);) { 
    alert(match + " at " + myRegex.lastIndex); 
} 

nhưng rõ ràng nó không phải là quá hữu ích cho test.

+0

Điều này có nghĩa là tôi nên đặt lastIndex thành 0 bản thân mình, phải không? – NStal

+0

+1 giải thích tốt, tôi không biết điều đó. –

+0

@NStal, Yes, thiết lập 'lastIndex' 0 trước khi thử nghiệm sẽ workaround vấn đề. –

2

Thường là một thử nghiệm được chọn để kiểm tra xem một số mô hình phù hợp ở tất cả, nhưng lá cờ toàn cầu cho phép bạn lặp qua một chuỗi hoặc là đếm các trận đấu hay, giống như exec, làm điều gì đó với nhau lastIndex. Một cách sử dụng khác là thiết lập lastIndex của rx trước khi thử nghiệm được định dạng, để bỏ qua các kết quả phù hợp trước một số chỉ mục ký tự.

var count=0, rx=/\s+/g, rx.lastIndex=100; 
while(rx.test(string))count++; 
Các vấn đề liên quan