35 votes

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

Étant donné le code rubis:

 "aaaa\nbbbb\n\n".split(/\n/)
 

Cela produit:

 ["aaaa", "bbbb"] 
 

Je voudrais que la sortie inclue la ligne vide indiquée par \n\n - Je veux que le résultat soit:

 ["aaaa", "bbbb", ""]
 

Quelle est la façon la plus simple / la meilleure d'obtenir ce résultat exact?

54voto

the Tin Man Points 69148

Je vous recommande d'utiliser lines au lieu de split pour cette tâche. lines conservera la fuite de saut de ligne, qui vous permet de voir l'souhaité empty-line. Utiliser chomp nettoyer:

"aaaa\nbbbb\n\n".lines.map(&:chomp)
[
    [0] "aaaa",
    [1] "bbbb",
    [2] ""
]

D'autres, plus compliquées, les moyens d'y arriver sont:

"aaaa\nbbbb\n\n".split(/(\n)/).each_slice(2).map{ |ary| ary.join.chomp }
[
    [0] "aaaa",
    [1] "bbbb",
    [2] ""
]

C'est en prenant avantage de l'utilisation d'une méthode de capture-groupe en split, ce qui renvoie le fractionner le texte avec l'intervenant texte divisé sur. each_slice des groupes les éléments en deux-élément sous-tableaux. map obtient chaque élément du sous-tableau, ne l' join , suivie par l' chomp.

Ou:

"aaaa\nbbbb\n\n".split(/(\n)/).delete_if{ |e| e == "\n" }
[
    [0] "aaaa",
    [1] "bbbb",
    [2] ""
]

Voici ce qu' split est de retour:

"aaaa\nbbbb\n\n".split(/(\n)/)
[
    [0] "aaaa",
    [1] "\n",
    [2] "bbbb",
    [3] "\n",
    [4] "",
    [5] "\n"
]

Nous n'avons pas utilisé très souvent, mais il peut être utile.

14voto

Mark Byers Points 318575

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.

4voto

Dave Newton Points 93112

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X