2009-09-01 9 views
13

Đó là sự hiểu biết của tôi rằng cả ba dòng dưới đây sẽ trả về ARRAY với 2 kết quả trong đó. Tuy nhiên, RegExp sẽ chỉ trả về 1 kết quả bất kể số lần regex lặp lại trong chuỗi.Javascript Regexp không trả lại kết quả toàn cầu

Một số người có thể giải thích lý do không? Và có lẽ đề nghị làm thế nào tôi có thể nhận được RegExp để cho tôi kết quả toàn cầu?

//INTPUT: 
    console.log(new RegExp("New York", "gi").exec("New York New York")); 

//OUTPUT: 
["New York"] 

//INTPUT: 
    console.log(new RegExp(/New York/gi).exec("New York New York")); 

//OUTPUT: 
["New York"] 

//INTPUT: 
    console.log("New York New York".match(/New York/gi)); 

//OUTPUT: 
["New York", "New York"] 
+0

bây giờ những gì thực sự rất tò mò tôi là nếu bạn cố gắng '('New York New York') .match (/ New York/gi) 'nó sẽ chỉ mang lại 1 kết quả (như mong đợi) và tôi không thể nghĩ ra một cách tốt hơn để thực hiện điều này (khi cần thiết) [khác hơn là lặp lại nó] (http: // stackoverflow. com/questions/42328875/javascript-regex-to-remove-tất cả các số-với-cụ thể-chiều dài-hoặc-do-một-dai dẳng)! :( – cregox

Trả lời

20

ví dụ thứ ba của bạn là cách tốt nhất để nhận được mảng kết quả phù hợp.

RegExp.exec thực sự nhớ vị trí của nó, và trả về kết quả tiếp theo cho các cuộc gọi tiếp theo:

>>> var v = /new york/gi 
>>> v.exec("NEW YORK new york") 
["NEW YORK"] 
>>> v.exec("NEW YORK new york") 
["new york"] 
>>> v.exec("NEW YORK new york") 
null 
+2

bạn có thể tận dụng điều này để tự xây dựng bản thân, nhưng thật dễ dàng hơn khi gọi string.match –

+0

Tôi có một loạt từ khóa mà tôi đang cố gắng đếm số lần xuất hiện trong chuỗi. cách để làm điều đó? – StefanHayden

11

Điều này được mong đợi, exec() trả về một trận đấu duy nhất nhưng cung cấp thêm thông tin về trận đấu so với trận đấu(). Nếu bạn chỉ muốn tất cả các trận đấu, sử dụng match(). Từ JavaScript: The Definitive Guide:

Nhớ lại rằng trận() trả về một mảng của trận đấu khi đã thông qua một thế giới cụm từ thông dụng. exec(), theo độ tương phản , luôn trả về một kết quả duy nhất và cung cấp đầy đủ thông tin về về trận đấu đó. Khi exec() được gọi trên một email thường lệ có cờ g, nó đặt thuộc tính lastIndex của chuỗi con phù hợp . Khi exec() được gọi lần thứ hai cho cùng một biểu thức chính quy , nó bắt đầu tìm kiếm tại vị trí ký tự được chỉ định bởi thuộc tính lastIndex.