92 votes

Quel est le meilleur moyen de couper une chaîne en morceaux de longueur donnée en Ruby?

J'ai été à la recherche d'un élégant et efficace pour morceau d'une chaîne en sous-chaînes d'une longueur donnée dans Ruby.

Jusqu'à présent, le meilleur que j'ai pu arriver, c'est ça:

def chunk(string, size)
  (0..(string.length-1)/size).map{|i|string[i*size,size]}
end

>> chunk("abcdef",3)
=> ["abc", "def"]
>> chunk("abcde",3)
=> ["abc", "de"]
>> chunk("abc",3)
=> ["abc"]
>> chunk("ab",3)
=> ["ab"]
>> chunk("",3)
=> []

Vous souhaitez peut - chunk("", n) de revenir [""] au lieu de []. Si oui, il suffit d'ajouter ce que la première ligne de la méthode:

return [""] if string.empty?

Recommanderiez-vous une meilleure solution?

Modifier

Merci à Jeremy Ruten pour cette élégante et efficace solution:

def chunk(string, size)
    string.scan(/.{1,#{size}}/)
end

166voto

Jeremy Ruten Points 59989

Utilisez String#scan :

 >> 'abcdefghijklmnopqrstuvwxyz'.scan(/.{4}/)
=> ["abcd", "efgh", "ijkl", "mnop", "qrst", "uvwx"]
>> 'abcdefghijklmnopqrstuvwxyz'.scan(/.{1,4}/)
=> ["abcd", "efgh", "ijkl", "mnop", "qrst", "uvwx", "yz"]
>> 'abcdefghijklmnopqrstuvwxyz'.scan(/.{1,3}/)
=> ["abc", "def", "ghi", "jkl", "mno", "pqr", "stu", "vwx", "yz"]
 

19voto

Jason Points 1155

Voici une autre façon de le faire:

 "abcdefghijklmnopqrstuvwxyz".chars.to_a.each_slice(3).to_a.map {|s| s.to_s }
 

=> ["abc", "def", "ghi", "jkl", "mno", "pqr", "stu", "vwx", "yz"]

1voto

Chuck Points 138930
 test.split(/(...)/).reject {|v| v.empty?}
 

Le rejet est nécessaire car il contient sinon l'espace vide entre les ensembles. Mon regex-fu n'est pas tout à fait à la recherche de solutions à cela.

0voto

Charlie Martin Points 62306

Y a-t-il d'autres contraintes que vous avez en tête? Sinon, je serais terriblement tenté de faire quelque chose de simple, comme

 [0..10].each {
   str[(i*w),w]
}
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X