2012-04-24 28 views
6

The Ruby (1.9.3) tài liệu dường như ngụ ý quét đó là tương đương với = ~ ngoại trừ việcruby ​​regex quét so với = ~

  1. quét trả về nhiều trận đấu, trong khi lợi nhuận = ~ chỉ sự xuất hiện đầu tiên, và
  2. quét trả về dữ liệu đối sánh, trong khi = ~ trả về chỉ mục.

Tuy nhiên, trong ví dụ sau, hai phương pháp có vẻ trả về các kết quả khác nhau cho cùng một chuỗi và biểu thức. Tại sao vậy?

1.9.3p0 :002 > str = "Perl and Python - the two languages" 
=> "Perl and Python - the two languages" 
1.9.3p0 :008 > exp = /P(erl|ython)/ 
=> /P(erl|ython)/ 
1.9.3p0 :009 > str =~ exp 
=> 0 
1.9.3p0 :010 > str.scan exp 
=> [["erl"], ["ython"]] 

Nếu chỉ mục kết quả đầu tiên là 0, không được quét trả về "Perl" và "Python" thay vì "erl" và "python"?

Cảm ơn

Trả lời

12

Khi được đưa ra một biểu thức chính quy không có nhóm chụp, scan sẽ trả về một mảng các chuỗi, trong đó mỗi chuỗi đại diện cho một trận đấu của các biểu thức chính quy. Nếu bạn sử dụng scan(/P(?:erl|ython)/) (giống như regex của bạn ngoại trừ không có nhóm chụp), bạn sẽ nhận được ["Perl", "Python"], đó là những gì bạn mong đợi.

Tuy nhiên khi được cung cấp một regex với các nhóm chụp, scan sẽ trả về một mảng các mảng, trong đó mỗi mảng phụ chứa các ảnh chụp của một kết quả nhất định. Vì vậy, nếu bạn có ví dụ như regex (\w*):(\w*), bạn sẽ nhận được một mảng các mảng trong đó mỗi mảng con chứa hai chuỗi: phần trước dấu hai chấm và phần sau dấu hai chấm. Và trong ví dụ của bạn, mỗi mảng phụ chứa một chuỗi: phần khớp với (erl|ython).

+0

Cảm ơn, vì vậy quá trình quét hoàn toàn không tương đương với = ~, khi có các nhóm liên quan? – Anand

+2

@Anand Vì quá trình quét trả về một cái gì đó hoàn toàn khác so với = ~, tôi không nghĩ nó chính xác đến mức nào để nói chúng tương đương nhau. Kết quả đầu tiên được trả về bằng quét sẽ là một chuỗi con bắt đầu từ chỉ mục 'str = ~ exp' nếu và chỉ khi' exp' không chứa các nhóm chụp. Ngoài ra, bạn cũng có thể nói rằng kết quả đầu tiên sẽ tương đương với 'Regexp.last_match.string' nhận được sau khi thực hiện' str = ~ exp' nếu không chứa các nhóm bắt và 'Regexp.last_match.captures' nếu nó không chứa các nhóm chụp. – sepp2k

+0

Vui mừng khi thấy loại bài đăng mà bạn thực sự có thể học hỏi. – texasbruce