web-dev-qa-db-fra.com

Ruby divisé par des espaces

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

39
JJ Beck

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.

43
Candide

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.

48
Ajedi32
input = <<X
     aa bbb
cc    dd ee
X

input.strip.split(/\s+/)
21
sawa
input.split("\s")

Si "\s" est utilisé à la place de /\s/, les blancs seront supprimés du résultat.

6
vidang

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