Comment découper une chaîne en x morceaux égaux en ruby
J'ai une chaîne en ruby comme ceci:
str = "AABBCCDDEEFFGGHHIIJJ01020304050607080910"
# 20 letters and 20 numbers in this case
Je veux partager ce dans la moitié, ce que je peux faire comme ceci:
str[0, str.length/2]
ou
str.split(0, str.length/2)
Après cela, j'ai besoin de faire des tableaux avec les caractères, mais avec une longueur de 2 pour chaque élément comme ceci:
["AA", "BB", "CC", "DD", "EE", "FF", "GG", "HH", "II", "JJ"],
[01, 02, 03, 04, 05, 06, 07, 08, 09, 10]
Le problème est, je ne peux pas trouver une manière concise pour convertir cette chaîne. Je peux faire quelque chose comme ceci
arr = []
while str.length > 0 do
arr << str[0, 1]
str[0, 1] = ""
end
mais je veux quelque chose comme str.split(2)
, et la longueur de la chaîne peut changer à tout moment.
OriginalL'auteur Nicos Karalis | 2012-08-20
Vous devez vous connecter pour publier un commentaire.
Comment à ce sujet?
Rapide et sale de référence (Ruby 1.9) montre la est environ 3 fois plus lent que le
scan
indice de référence. > l'indice de Référence.mesurer { SecureRandom.hex(12_000_000).scan(/.{,7}/) } => 2.280000 0.090000 2.370000 ( 2.362817) > l'indice de Référence.mesurer { SecureRandom.hex(12_000_000).caractères.each_slice(8).carte(&:join) } => 6.780000 0.240000 7.020000 ( 7.015237)Le
scan(/.{100}/)
méthode de laisser sur le dernier morceau moins de 100 caractères, donc je vois certaines personnes, ce qui suggèrescan(/.{1,100}/)
à la place, mais c'est erratique, et parfois se divise à bizarre limites dans les longues chaînes. Cette each_slice méthode beaucoup plus travaillé de manière fiable pour moi.OriginalL'auteur Michael Kohl
Vous pouvez utiliser le scan méthode:
Pas de soucis, j'ai juste pensé qu'il valait la peine de poster cette réponse, car il utilise une méthode au lieu de trois. Mais quelle que soit vous convient est bon 🙂
Très sympa! Puisque vous pouvez interpoler des expressions régulières comme les chaînes, vous pouvez même l'utiliser comme ceci:
scan(/.{1,#{size}}/)
Merci @MichaelKohl !! Je n'avais pas pensé à l'interpolation de la chose, c'est toujours un plaisir d'apprendre de personnes avec une connaissance profonde comme vous 🙂 En passant, pourriez-vous m'expliquer en bref ce que
&:join
signifie dans votre réponse?Sûr:
str.chars.each_slice(2)
retourne unEnumerator
pour la chaîne, ce qui engendrera des 2 élément de tableau. Nous avons ensuitemap
sur les matrices etjoin
les deux chaînes d'une seule lettre ensemble.&:join
utilise leSymbol#to_proc
raccourci. La forme longue seraitmap { |arr| arr.join }
.OriginalL'auteur davids
2.1.0 :642 > "d852".scan(/../)
=> ["d8", "52"]
OriginalL'auteur wxianfeng