Để 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:
- 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ố.
- 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
.
Nguồn
2012-01-18 14:13:34
Đ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
+1 giải thích tốt, tôi không biết điều đó. –
@NStal, Yes, thiết lập 'lastIndex' 0 trước khi thử nghiệm sẽ workaround vấn đề. –