7
votes

Manière la plus simple de convertir "A / B / C" en ["A / B / C", "A / B", "A"]]

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).


1 commentaires

Vous connaissez fileutils.mkdir_p , non?


4 Réponses :


4
votes

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"]


5 commentaires

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 . 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.



12
votes
"foo/bar/baz".enum_for(:scan, %r{/|$}).map {Regexp.last_match.pre_match}

2 commentaires

Wow. C'est presque Lisp sans toutes les parens.


Bon! plus facile de code "FOO / BAR / BAZ" .Enum_for (: Numérisation,% R {/ | $}). Carte {$ `}



0
votes

Pas tout aussi efficace que la réponse choisie, et donne [] lorsqu'il est donné une chaîne vide, plutôt que [""] , mais c'est un véritable doublure: P xxx


0 commentaires

0
votes
->(l,s,z){
    ( t = s[/#{z}.[^\/]*/] ) && [l[l,s,t], t]
}.tap{ |l|
    break l[l,'a/b/c','']
}.flatten.compact

0 commentaires