Dans Ruby, j'aimerais convertir une chaîne slash-séparée telle que "FOO / BAR / BAZ" dans ["FOO / BAR / BAZ", "FOO / BAR", "FOO"]. J'ai déjà des solutions quelques lignes de longues lignes; Je cherche un élégant doublure. Il doit également fonctionner pour un nombre arbitraire de segments (0 et plus). P>
4 Réponses :
La réponse votée la plus élevée fonctionne, mais voici une façon légèrement plus courte de le faire que je pense être plus lisible pour ceux qui ne connaissent pas toutes les fonctionnalités utilisées:
> s = 'abc/def/ghi'
> a=[]; s.scan(/\/|$/){a << $`}
> a
["abc", "abc/def", "abc/def/ghi"]
Sur Ruby 1.8.7 Le résultat n'est que # => "ABC / DEF / GHI" et non le tableau comme spécifié dans la réponse
@NAS: La valeur de retour sera la chaîne dans n'importe quelle version de Ruby. La matrice demandée sera dans la variable A code>. Si vous en étiez au courant et que vous n'étiez que de nitpicking, n'hésitez pas à ignorer mon commentaire.
Vous pouvez simplifier le code dans le bloc plus loin en faisant: a = []; 'ABC / DEF / GHI'.SCAN (/ \ / | $ /) {A << $ `}
J'accepte cela avec la mise en garde que l'utilisation de la méfiance éliminerait le besoin d'un inverse :)
@Yehuda Katz: Utiliser unshift Cela deviendra O (n ^ 2) au lieu de O (n) (je suppose que la numérisation peut aller linéairement à travers la chaîne avec la regex donnée), donc l'utilisation de l'inverse devrait être beaucoup plus efficace.
"foo/bar/baz".enum_for(:scan, %r{/|$}).map {Regexp.last_match.pre_match}
Wow. C'est presque Lisp sans toutes les parens.
Bon! plus facile de code "FOO / BAR / BAZ" .Enum_for (: Numérisation,% R {/ | $}). Carte {$ `}
Pas tout aussi efficace que la réponse choisie, et donne [] code> lorsqu'il est donné une chaîne vide, plutôt que [""] code>, mais c'est un véritable doublure: P
->(l,s,z){
( t = s[/#{z}.[^\/]*/] ) && [l[l,s,t], t]
}.tap{ |l|
break l[l,'a/b/c','']
}.flatten.compact
Vous connaissez
fileutils.mkdir_p code>, non?