Comment puis-je écrire une fonction Ruby qui sépare l'entrée par n'importe quel type d'espace blanc et supprime tous les espaces blancs du résultat? Par exemple, si l'entrée est
aa bbb
cc dd ee
Retourne ensuite un tableau ["aa", "bbb", "cc", "dd", "ee"]
.
Les éléments suivants devraient fonctionner pour l'exemple que vous avez donné:
str.gsub(/\s+/m, ' ').strip.split(" ")
il renvoie:
["aa", "bbb", "cc", "dd", "ee"]
Signification du code:
/\s+/m
Est la partie la plus compliquée. \s
Signifie un espace blanc, donc \s+
Signifie une ou plusieurs lettres d'espace blanc. Dans la partie /m
, m
est appelé un modificateur, dans ce cas cela signifie, multiligne , ce qui signifie visiter plusieurs lignes, pas seulement celle qui est le comportement par défaut. Ainsi, /\s+/m
Signifie trouver des séquences d'un ou plusieurs espaces blancs.
gsub
signifie remplacer tout.
strip
est l'équivalent de trim
dans d'autres langues et supprime les espaces du début et de la fin de la chaîne.
Comme, j'écrivais l'explication, cela pourrait être le cas où vous vous retrouvez avec un caractère de fin à la fin ou au début de la chaîne.
Pour être sûr
Le code pourrait s'écrire:
str.gsub(/\s+/m, ' ').gsub(/^\s+|\s+$/m, '').split(" ")
Donc si vous aviez:
str = "\n aa bbb\n cc dd ee\n\n"
Vous obtiendrez alors:
["aa", "bbb", "cc", "dd", "ee"]
Signification du nouveau code:
^\s+
Une séquence d'espaces blancs au début de la chaîne
\s+$
Une séquence d'espaces blancs à la fin de la chaîne
Donc gsub(/^\s+|\s+$/m, '')
signifie supprimer toute séquence d'espace blanc au début de la chaîne et à la fin de la chaîne.
Il s'agit du comportement par défaut de String#split
:
input = <<-TEXT
aa bbb
cc dd ee
TEXT
input.split
Résultat:
["aa", "bbb", "cc", "dd", "ee"]
Cela fonctionne dans toutes les versions de Ruby que j'ai testées, y compris 1.8.7, 1.9.3, 2.0.0 et 2.1.2.
input = <<X
aa bbb
cc dd ee
X
input.strip.split(/\s+/)
input.split("\s")
Si "\s"
est utilisé à la place de /\s/
, les blancs seront supprimés du résultat.
Comme une légère modification de la réponse de Vidaica, dans Ruby 2.1.1 il ressemble
input.split(" ")
Compensera tous les espaces, qu'il s'agisse d'espaces, de tabulations ou de nouvelles lignes, ce qui donne:
["aa", "bbb", "cc", "dd", "ee"]