web-dev-qa-db-fra.com

Comment diviser la chaîne entre de nouvelles lignes et conserver des lignes vides?

É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?

35
Kirk Woll

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.

53
the Tin Man

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.

14
Mark Byers

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", ""] 
4
Dave Newton