2010-05-17 32 views
43

thể trùng lặp:
Javascript regex returning true.. then false.. then true.. etctại sao regex.test javascript của tôi() cho kết quả xen kẽ

var r = /\d/g; 
var a = r.test("1"); // will be true 
var b = r.test("1"); // will be false 
console.log(a == b); // will be false 

Xin giải thích cho tôi tại sao kết quả của r.test ("1 ") thay thế bằng mỗi cuộc gọi?

Tôi đã có thể giải quyết được vấn đề tôi đang gặp phải bằng cách xóa công cụ sửa đổi g. Tuy nhiên tôi vẫn muốn hiểu tại sao điều này xảy ra.

Trả lời

63

Khi bạn đang sử dụng /g, đối tượng regex sẽ lưu trạng thái giữa các cuộc gọi (vì bạn nên sử dụng nó để khớp với nhiều cuộc gọi). Nó khớp một lần, nhưng các cuộc gọi tiếp theo bắt đầu từ sau trận đấu ban đầu.

(Đây là bản sao của Javascript regex returning true.. then false.. then true.. etc)

+0

cảm ơn bạn! Tôi tìm thấy một số chi tiết hơn nữa giải thích rằng .test về cơ bản là viết tắt của .exec()! = Null, và nó là .exec() lưu trữ lastIndex cho cuộc gọi tiếp theo. (http://www.regular-expressions.info/javascript.html) Điều kỳ lạ là ngay cả khi được cung cấp các chuỗi khác nhau cho mỗi cuộc gọi, điều tương tự cũng xảy ra. Liệu lastIndex không đặt lại nếu nó được gọi trên một chuỗi khác nhau? –

+1

Không, vì 'lastIndex' là thuộc tính của regex, không phải chuỗi. Trong Perl, ngược lại, nó được liên kết với chuỗi (thuộc tính 'pos'), trong khi trong Java nó được duy trì bởi đối tượng Matcher. 'lastIndex' là một nguồn gây thất vọng nhiều: http://blog.stevenlevithan.com/archives/fixing-javascript-regexp –

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