Étant donné le code Ruby:
"aaaa\nbbbb\n\n".split(/\n/)
Cela produit:
["aaaa", "bbbb"]
Je souhaite que la sortie inclue la ligne vide indiquée par \n\n
- Je veux que le résultat soit:
["aaaa", "bbbb", ""]
Quelle est la manière la plus simple/la meilleure d'obtenir ce résultat exact?
Je recommande d'utiliser lines
au lieu de split
pour cette tâche. lines
conservera le saut de ligne final, ce qui vous permet de voir la ligne vide souhaitée. Utilisez chomp
pour nettoyer:
"aaaa\nbbbb\n\n".lines.map(&:chomp)
[
[0] "aaaa",
[1] "bbbb",
[2] ""
]
D'autres moyens plus compliqués de s'y rendre sont:
"aaaa\nbbbb\n\n".split(/(\n)/).each_slice(2).map{ |ary| ary.join.chomp }
[
[0] "aaaa",
[1] "bbbb",
[2] ""
]
Il profite de l'utilisation d'un groupe de capture dans split
, qui renvoie le texte divisé avec le texte intermédiaire sur lequel il est divisé. each_slice
regroupe ensuite les éléments en sous-tableaux à deux éléments. map
obtient chaque sous-tableau à deux éléments, fait le join
suivi du chomp
.
Ou:
"aaaa\nbbbb\n\n".split(/(\n)/).delete_if{ |e| e == "\n" }
[
[0] "aaaa",
[1] "bbbb",
[2] ""
]
Voici ce que split
retourne:
"aaaa\nbbbb\n\n".split(/(\n)/)
[
[0] "aaaa",
[1] "\n",
[2] "bbbb",
[3] "\n",
[4] "",
[5] "\n"
]
Nous ne voyons pas cela utilisé très souvent, mais cela peut être utile.
Vous pouvez fournir un argument négatif pour le deuxième paramètre de fractionnement pour éviter de supprimer les chaînes vides de fin;
"aaaa\nbbbb\n\n".split(/\n/, -1)
Notez que cela vous donnera une chaîne vide supplémentaire par rapport à ce que vous voulez.
Vous pouvez utiliser l'argument numérique, mais IMO c'est un peu délicat car (IMO) ce n'est pas tout à fait conforme à ce que j'attendais, et AFAICT vous voudriez couper le dernier champ nul:
jruby-1.6.7 :020 > "aaaa\nbbbb\n\n".split(/\n/, -1)[0..-2]
=> ["aaaa", "bbbb", ""]