2010-02-13 6 views
7

В Ruby я хотел бы преобразовать отдельную строку с косой чертой, такую ​​как «foo/bar/baz» в ["foo/bar/baz", "foo/bar", "foo"]. У меня уже есть решения на несколько строк; Я ищу элегантный элегантный лайнер. Он также должен работать для произвольного числа сегментов (0 и выше).Самый простой способ конвертировать «a/b/c» в [«a/b/c», «a/b», «a»]

+2

Вы знаете о 'FileUtils.mkdir_p', правильно? – Svante

ответ

4

Самые высокие проголосовавшие ответа работает, но вот немного короче способ сделать это, что я думаю, что будет более удобным для чтения для тех, кто не знаком со всеми особенностями используемых там:

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

Результат хранится в a:

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

Если порядок важен, вы можете полностью изменить массив или использовать unshift вместо <<.

Благодаря dkubb и OP для улучшения этого ответа.

+0

На рубине 1.8.7 результатом является только # => «abc/def/ghi», а не массив, как указано в ответе – nas

+2

@nas: Возвращаемое значение будет строкой в ​​любой версии ruby. Запрошенный массив будет находиться в переменной 'a'. Если бы вы знали об этом и были просто придирчивы, не стесняйтесь игнорировать мои комментарии. – sepp2k

+2

Вы можете упростить код в блоке далее: 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

Ничего себе. Это почти шепотом без всех парнеров. –

+0

good! Более простой код «foo/bar/baz» .enum_for (: scan,% r {/ | $}). Map {$ '} – user3673267

0

Не совсем так эффективно, как выбранный ответ, и дает [], когда дается пустая строка, а не [""], но его реальная один лайнер: 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

К сожалению, это не самый простой ... – Nakilon

Смежные вопросы