Самый простой способ конвертировать "a / b / c" в ["a / b / c", "a / b", "a"] - PullRequest
7 голосов
/ 13 февраля 2010

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

Ответы [ 4 ]

12 голосов
/ 13 февраля 2010
"foo/bar/baz".enum_for(:scan, %r{/|$}).map {Regexp.last_match.pre_match}
4 голосов
/ 13 февраля 2010

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

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

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

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

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

Спасибо dkubb и ОП за улучшения этого ответа.

0 голосов
/ 19 ноября 2010
->(l,s,z){
    ( t = s[/#{z}.[^\/]*/] ) && [l[l,s,t], t]
}.tap{ |l|
    break l[l,'a/b/c','']
}.flatten.compact
0 голосов
/ 14 февраля 2010

Не так эффективно, как выбранный ответ, и выдает [], когда ему дана пустая строка, а не [""], но ее настоящий вкладыш: P

s.split('/').inject([]) { |a,d| a.unshift( [a.first,d].compact.join('/') ) }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...