2015-06-17 15 views
6

Bất cứ ai cũng có thể giải thích cho tôi, tại sao địa chỉ Regex biến và không địa phương Biến Regex có đầu ra khác nhau.Regex.test() là cho đúng tuần tự sai?

var regex1 = /a|b/g; 
function isAB1() { 
    return regex1.test('a'); 
} 
console.log(isAB1()); // true 
console.log(isAB1()); // false 
console.log(isAB1()); // true 
console.log(isAB1()); // false 


function isAB2() { 
    var regex2 = /a|b/g; 
    return regex2.test('a'); 
} 
console.log(isAB2()); // true 
console.log(isAB2()); // true 
console.log(isAB2()); // true 
console.log(isAB2()); // true 

Tôi đã tạo JSFiddle cho cùng một here.

+1

từ [doc] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/test): 'đượ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ẽ trước qua trận đấu trước đó'. – Hacketo

Trả lời

6

Bạn đã cung cấp regex cờ g có nghĩa là nó sẽ toàn cầu khớp với kết quả. Bằng cách đó, bạn yêu cầu regex của bạn một cách rõ ràng để giữ trạng thái về các kết quả phù hợp trước đó của nó.

var regex1 = /a|b/g; 

> regex1.lastIndex 
0 
> regex1.test('a'); 
true 
> regex1.lastIndex 
1 
> regex1.test('a'); 
false 

Nếu bạn xóa g bạn sẽ nhận được kết quả mong đợi.

Bạn có thể kiểm tra biểu thức của mình .lastIndex thuộc tính cho thời điểm đối sánh được thực hiện.

+0

Vâng, bạn nói đúng. Regex2 cục bộ được khởi động lại mỗi lần khởi động của isAB2, vì vậy isAB2 luôn trả về true –

+0

Đúng, nó là một regex khác nhau mỗi lần. –

+1

Đây là một bài viết liên quan Axel đã viết http://www.2ality.com/2013/08/regexp-g.html –

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