2011-12-14 38 views
6

Tôi có chuỗi "111221" và muốn khớp với tất cả các bộ số nguyên bằng nhau liên tiếp: ["111", "22", "1"].Chuỗi trận đấu của các ký tự liên tiếp trong một chuỗi

Tôi biết rằng có một điều regex đặc biệt để làm điều đó nhưng tôi không thể nhớ và tôi khủng khiếp với Googling.

+1

gì sẽ xảy ra khi đầu vào có ký tự không phải chữ số, ví dụ: '" 111aaa222 "' và '" 111aaa111 "'? – Phrogz

Trả lời

10

Sử dụng regex trong Ruby 1.8.7+:

p s.scan(/((\d)\2*)/).map(&:first) 
#=> ["111", "22", "1"] 

này hoạt động vì (\d) chụp bất kỳ chữ số, và sau đó \2* nắm bắt số không hoặc nhiều hơn bất kỳ nhóm nào (dấu ngoặc đơn mở thứ hai) phù hợp. Cần có (…) bên ngoài để chụp toàn bộ kết quả theo số scan. Cuối cùng, scan trả lại một mình:

[["111", "1"], ["22", "2"], ["1", "1"]] 

... vì vậy chúng tôi cần phải chạy qua và chỉ giữ mục đầu tiên trong mỗi mảng. Trong Ruby 1.8.6+ (mà không có Symbol#to_proc để thuận tiện):

p s.scan(/((\d)\2*)/).map{ |x| x.first } 
#=> ["111", "22", "1"] 

Với không Regex, đây là một niềm vui một (phù hợp với bất kỳ char) mà làm việc trong Ruby 1.9.2:

p s.chars.chunk{|c|c}.map{ |n,a| a.join } 
#=> ["111", "22", "1"] 

đây là một phiên bản mà nên làm việc ngay cả trong Ruby 1.8.6:

p s.scan(/./).inject([]){|a,c| (a.last && a.last[0]==c[0] ? a.last : a)<<c; a } 
# => ["111", "22", "1"] 
+1

"hình ảnh vui nhộn" của bạn sẽ khớp với "00aa00" dưới dạng ["000000"] - hoạt động trên đầu vào mẫu, nhưng không khớp với bất kỳ ví dụ nào không tầm thường. – klochner

+0

@klochner Ack! Bạn đúng. Cố định, cảm ơn. – Phrogz

-2

bạn có thể thử là

string str ="111221"; 
string pattern [email protected]"(\d)(\1)+"; 

Hy vọng có thể giúp bạn

+1

Downvoted vì a) điều này không hoạt động (bạn cần '*' thay vì '+') và b) đây không phải là cú pháp Ruby, và không hoạt động trong Ruby ngay cả trực tiếp. – Phrogz

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