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