En Ruby, me gustaría convertir una cadena separada por barras como "foo/bar/baz" en ["foo/bar/baz", "foo/bar", "foo"]. Ya tengo soluciones de algunas líneas de largo; Estoy buscando un elegante one-liner. También necesita trabajar para números arbitrarios de segmentos (0 y más).La manera más fácil de convertir "a/b/c" a ["a/b/c", "a/b", "a"]
Respuesta
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.
En ruby 1.8.7 el resultado es solo # => "abc/def/ghi" y no la matriz como se especifica en la respuesta – nas
@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
Puede simplificar aún más el código en el bloque haciendo: a = []; 'abc/def/ghi'.scan (/ \/| $ /) {a << $ '} – dkubb
"foo/bar/baz".enum_for(:scan, %r{/|$}).map {Regexp.last_match.pre_match}
'Enumerator' FTW! –
Wow. Eso es casi lisp sin todos los parens. –
bueno! Código más fácil "foo/bar/baz" .enum_for (: escanear,% r {/ | $}). Map {$ '} – user3673267
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('/')) }
->(l,s,z){
(t = s[/#{z}.[^\/]*/]) && [l[l,s,t], t]
}.tap{ |l|
break l[l,'a/b/c','']
}.flatten.compact
Vaya, no es el más fácil ... – Nakilon
- 1. cómo recortar "a b c" en "abc"
- 2. ABC Python: registrar vs subclases
- 3. ¿Qué significa ABC en WCF?
- 4. Cómo truncar un correo electrónico a parte-local 'abc ... @ gmail.com'
- 5. Subclase dict: ¿UserDict, dict o ABC?
- 6. ¿Ruby tiene un método string.startswith ("abc") incorporado?
- 7. Cómo crear un índice de texto para la búsqueda '% abc%'?
- 8. cadena Convert "abc" a $ picadillo -> {a} -> {b} -> {c} en Perl
- 9. ¿Hay alguna manera fácil de convertir Criteria a HQL?
- 10. sintaxis before_filter cuando quiere "exceptuar" el controlador "abc"
- 11. jQuery/JavaScript: convertir píxeles a em de una manera fácil
- 12. La manera más eficiente de convertir BCD a binario
- 13. ¿Cuál es la forma más fácil de convertir el marcado de Wiki a HTML?
- 14. Manera más fácil de mover un proyecto en Eclipse
- 15. ¿La manera más fácil de mostrar la ubicación?
- 16. ¿La manera más fácil de determinar si la conexión a internet del iPhone está disponible?
- 17. La forma más fácil de convertir un NSString a su equivalente de moneda en Cocoa
- 18. Un modelo de Django que las subclases de un ABC, da un conflicto metaclase
- 19. Cuál es la forma más fácil de convertir latitud y longitud a los valores dobles
- 20. ¿La forma más fácil de convertir una URL a un hipervínculo en una cadena C#?
- 21. ¿Cuál es la forma más fácil de convertir una cadena xhtml a PDF utilizando Flying Saucer?
- 22. La manera más fácil de leer un archivo de configuración perteneciente a otra aplicación
- 23. yaml-cpp La manera más fácil de iterar a través de un mapa con valores indefinidos
- 24. Filtrar nombres de archivo: obtener * .abc sin * .abcd, o * .abcde, etc.
- 25. ¿La manera más fácil de clasificar los nodos DOM?
- 26. Java - ¿Por qué el siguiente código imprime "BAC", en lugar de "ABC"?
- 27. ¿La manera más fácil de empaquetar/minificar múltiples archivos javascript?
- 28. La manera más fácil de recuperar XmlHttpRequest entre navegadores
- 29. La manera más fácil de escribir y leer un XML
- 30. ¿La manera más fácil de hacer que C# no instanciar una clase a menos que herede?
Usted sabe de 'FileUtils.mkdir_p', ¿verdad? – Svante