2010-02-13 47 views

Trả lời

4

cao nhất tác phẩm bình chọn câu trả lời, nhưng đây là một cách hơi ngắn hơn để làm điều đó mà tôi nghĩ rằng sẽ dễ đọc hơn đối với những người không quen thuộc với tất cả các tính năng sử dụng có:

a=[]; s.scan(/\/|$/){a << $`} 

Kết quả được lưu trữ trong a:

> s = 'abc/def/ghi' 
> a=[]; s.scan(/\/|$/){a << $`} 
> a 
["abc", "abc/def", "abc/def/ghi"] 

Nếu trật tự là rất quan trọng, bạn có thể đảo ngược mảng hoặc sử dụng unshift thay vì <<.

Nhờ dkubb và OP cho các cải tiến cho câu trả lời này.

+0

Trên ruby ​​1.8.7 kết quả chỉ là # => "abc/def/ghi" và không phải là mảng như được chỉ định trong câu trả lời – nas

+2

@nas: Giá trị trả về sẽ là chuỗi trong bất kỳ phiên bản ruby ​​nào. Mảng được yêu cầu sẽ nằm trong biến 'a'. Nếu bạn đã nhận thức được điều đó và chỉ là nitpicking, cảm thấy tự do để bỏ qua bình luận của tôi. – sepp2k

+2

Bạn có thể đơn giản hóa mã trong khối hơn nữa bằng cách thực hiện: a = []; 'abc/def/ghi'.scan (/ \/| $ /) {a << $ '} – dkubb

12
"foo/bar/baz".enum_for(:scan, %r{/|$}).map {Regexp.last_match.pre_match} 
+0

'Đếm 'FTW! –

+0

Rất tiếc. Đó là gần như lisp mà không có tất cả các parens. –

+0

mã dễ hơn "foo/bar/baz" .enum_for (: quét,% r {/ | $}) bản đồ {$ '} – user3673267

0

Không khá hiệu quả như câu trả lời lựa chọn, và cho [] khi đưa ra một chuỗi rỗng, chứ không phải là [""], nhưng nó là một thực lót: P

s.split('/').inject([]) { |a,d| a.unshift([a.first,d].compact.join('/')) } 
0
->(l,s,z){ 
    (t = s[/#{z}.[^\/]*/]) && [l[l,s,t], t] 
}.tap{ |l| 
    break l[l,'a/b/c',''] 
}.flatten.compact 
+0

Rất tiếc, nó không phải là dễ nhất ... – Nakilon

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