2010-02-13 20 views

Respuesta

4

Las mayores obras respuesta votadas, pero aquí es una manera un poco más corto para hacerlo que creo que será más fácil de leer para aquellos que no están familiarizados con todas las funciones que se utilizan allí:

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

El resultado se almacena en a:

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

Si el orden es importante, se puede invertir la matriz o utilizar en lugar de unshift<<.

Gracias a dkubb, y al OP por las mejoras en esta respuesta.

+0

En ruby ​​1.8.7 el resultado es solo # => "abc/def/ghi" y no la matriz como se especifica en la respuesta – nas

+2

@nas: El valor de retorno será la cadena en cualquier versión de ruby. La matriz solicitada estará en la variable 'a'. Si fueras consciente de eso y solo fueras quisquilloso, no dudes en ignorar mi comentario. – sepp2k

+2

Puede simplificar aún más el código en el bloque haciendo: 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

Wow. Eso es casi lisp sin todos los parens. –

+0

bueno! Código más fácil "foo/bar/baz" .enum_for (: escanear,% r {/ | $}). Map {$ '} – user3673267

0

No es tan eficiente como la respuesta elegida, y da [] cuando se administra una cadena vacía, en lugar de [""], pero es un verdadero chiste: 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

Vaya, no es el más fácil ... – Nakilon

Cuestiones relacionadas