2011-01-14 22 views
5

Hôm nay, tôi đã gặp một vấn đề biểu thức chính quy JavaScript rất lạ. Khi sử dụng công cụ sửa đổi toàn cục (// g), RegExp.test() mang lại các giá trị khác nhau trong các cuộc gọi tiếp theo. Bất cứ ai có thể giải thích lý do tại sao?Tại sao RegExp của JavaScript duy trì trạng thái giữa các cuộc gọi?

var s = "youtube.com/watch?v=XyeebVA3DNk"; 

var re1 = /^youtube\.com\/watch[a-zA-Z0-9_\-\?\&\=\/]+/g; 

console.log(re1.test(s)); // true 
console.log(re1.test(s)); // false 
console.log(re1.test(s)); // true 
console.log(re1.test(s)); // false 
console.log(re1.test(s)); // true 
console.log(re1.test(s)); // false 
console.log(re1.test(s)); // true 

var re2 = /^youtube\.com\/watch[a-zA-Z0-9_\-\?\&\=\/]+/; 

console.log(re2.test(s)); // true 
console.log(re2.test(s)); // true 
console.log(re2.test(s)); // true 
console.log(re2.test(s)); // true 
console.log(re2.test(s)); // true 
console.log(re2.test(s)); // true 

Tôi có thể tạo lại điều này trong Chrome 8 và FireFox 3.6.

Trả lời

7

Chỉ khi bạn sử dụng cờ g. Tôi đồng ý nó không phải là thiết kế tốt nhất, nhưng vấn đề là để cho bạn lặp lại các trận đấu, ví dụ: với re1.exec.

var s = "fo1,fo2,fo3,"; 
var re1 = /fo\d,/g; 
var match; 
while(match = re1.exec(s)) 
{ 
    alert(match); 
} 
2

"Nếu biểu thức chính quy của bạn sử dụng 'g' cờ, bạn có thể sử dụng phương pháp exec nhiều lần để tìm các trận đấu liên tiếp trong cùng một chuỗi. Khi bạn làm như vậy, việc tìm kiếm bắt đầu từ các chuỗi con của s đượ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 lên thuộc tính lastIndex). "

"Giống như với exec (hoặc kết hợp với nó), kiểm tra được gọi nhiều lần trên cùng một cá thể biểu thức chính quy toàn cầu sẽ chuyển qua kết quả trước đó."

var s = "youtube.com/watch?v=XyeebVA3DNk"; 

var re1 = /^youtube\.com\/watch[a-zA-Z0-9_\-\?\&\=\/]+/g; 

console.log(re1.test(s)); // true 

var re1 = /^youtube\.com\/watch[a-zA-Z0-9_\-\?\&\=\/]+/g; 

console.log(re1.test(s)); // true 
Các vấn đề liên quan