2010-02-13 24 views
7

Ruby'de, eğik çizgi gibi bir String'i dönüştürmek istiyorum. "foo/bar/baz" içine "foo/bar/baz", "foo/bar", "foo"]. Zaten birkaç satır uzunluğa sahip çözümlerim var; Zarif bir gömlek arıyorum. Ayrıca rasgele sayı segmentleri (0 ve üstü) için çalışmalıdır."a/b/c" öğesini "a/b/c", "a/b", "a" olarak dönüştürmenin en kolay yolu

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

sonuç depolanır:

burada
+2

Sen biliyor musunuz FileUtils.mkdir_p', değil mi? – Svante

cevap

4

yüksek oyu cevap eserlerini ama orada kullanılan tüm özellikleri aşina olmayanlar için daha okunabilir olacağını düşünüyorum bunu yapmak için biraz daha kısa yoludur a: Sıra önemlidir

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

, diziyi ters veya unshift yerine << kullanabilirsiniz.

dkubb'ye teşekkürler ve bu cevabın iyileştirilmesi için OP'ye.

+0

Ruby 1.8.7 üzerinde sonuç sadece # => "abc/def/ghi" şeklindedir ve – nas

+2

@nas yanıtında belirtilen diziyi değil: Geri dönüş değeri, ruby'nin herhangi bir sürümündeki dizge olacaktır. İstenen dizi 'a' değişkeninde olacaktır. Eğer bunun farkındaysanız ve sadece nitpicking iseniz, yorumumu görmezden gelmekten çekinmeyin. – sepp2k

+2

Aşağıdaki kod kullanılarak bloğu daha da basitleştirebilirsiniz: a = []; 'abc/def/ghi'.scan (/ \/| $ /) {a << $ '} – dkubb

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

'Enumerator' FTW! –

+0

Vay. Bütün parensler olmadan neredeyse lisp. –

+0

iyi! daha kolay kod "foo/bar/baz" .enum_for (: tarama,% r {/ | $}) harita {$}} – user3673267

0

oldukça olarak seçilen cevap olarak, verimli ve oldukça [""] daha boş bir dize verilen, ama onun gerçek bir liner zaman [] verir Değil: 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

Oops, bu kolay değil ... – Nakilon

İlgili konular