2011-11-03 36 views
34

Tôi mới sử dụng Ruby và luôn sử dụng String.scan để tìm kiếm sự xuất hiện đầu tiên của một số. Nó là loại kỳ lạ rằng giá trị trả về là trong mảng lồng nhau, nhưng tôi chỉ cần [0][0] cho các giá trị tôi muốn. (Tôi chắc chắn nó có mục đích của nó, chỉ là tôi chưa sử dụng nó.)Sự khác biệt giữa quét và khớp trên chuỗi Ruby

Tôi vừa phát hiện ra rằng có một phương pháp String.match. Và nó có vẻ thuận tiện hơn vì mảng được trả về không được lồng nhau.

Dưới đây là một ví dụ về hai, lần đầu tiên được quét:

>> 'a 1-night stay'.scan(/(a)?(\d*)[- ]night/i).to_a 
=> [["a ", "1"]] 

sau đó là trận đấu

>> 'a 1-night stay'.match(/(a)?(\d*)[- ]night/i).to_a 
=> ["a 1-night", "a ", "1"] 

Tôi có kiểm tra các API, nhưng tôi thực sự không thể phân biệt sự khác biệt, như cả hai được gọi là 'phù hợp với mô hình'.

Câu hỏi này, chỉ đơn giản là tò mò, về những gì scan có thể làm điều đó match không thể, và ngược lại. Bất kỳ kịch bản cụ thể mà chỉ có một người có thể thực hiện? Có phải là match kém hơn scan không?

Trả lời

40

Câu trả lời ngắn: scan sẽ trả về tất cả các kết quả phù hợp. Điều này không làm cho nó vượt trội, bởi vì nếu bạn chỉ muốn trận đấu đầu tiên, str.match[2] đọc đẹp hơn str.scan[0][1].

ruby-1.9.2-p290 :002 > 'a 1-night stay, a 2-night stay'.scan(/(a)?(\d*)[- ]night/i).to_a 
=> [["a ", "1"], ["a ", "2"]] 
ruby-1.9.2-p290 :004 > 'a 1-night stay, a 2-night stay'.match(/(a)?(\d*)[- ]night/i).to_a 
=> ["a 1-night", "a ", "1"] 
17

#scan trả về mọi thứ phù hợp với Regex.

#match trả về trận đấu đầu tiên như một đối tượng MatchData, trong đó có chứa dữ liệu được tổ chức bởi các biến đặc biệt như $& (những gì được kết hợp bởi các Regex, đó là những gì bản đồ để chỉ số 0), $1 (trận 1), $2, et al.

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