Comment dans le nœud pour diviser la chaîne par nouvelle ligne ('\ n')?


136

Comment dans le nœud pour diviser la chaîne par nouvelle ligne ('\ n')? J'ai une chaîne simple comme var a = "test.js\nagain.js"et je dois obtenir ["test.js", "again.js"]. j'ai essayé

a.split("\n");
a.split("\\n");
a.split("\r\n");
a.split("\r");

mais rien de ce qui précède ne fonctionne.



7
split()ne modifie pas la chaîne d'origine.
thgaskell

Cela ressemble à une question JavaScript pure, ne nécessitant pas de balise node.js.
Wyck le

Réponses:


239

Essayez de diviser sur une expression régulière comme /\r?\n/pour être utilisable par les systèmes Windows et UNIX.

> "a\nb\r\nc".split(/\r?\n/)
[ 'a', 'b', 'c' ]

3
Qu'en est-il des Mac classiques? ;)
AshleyF

10
Les Mac classiques sont morts avec Steve Jobs ... tristesse :(
ymz

43
pour attraper \ n, \ r et \ r \ n:split(/[\r\n]+/)
Julian TF

2
MacOSX n'utilise plus de single \ r, c'était uniquement pour les anciens Mac. Je pense qu'ils ont le même \ n que les autres unix.
jcubic

12
/ [\ r \ n] + / filtrera les lignes vides
Spongman

49

Si le fichier est natif de votre système (certainement aucune garantie de cela), alors Node peut vous aider:

var os = require('os');

a.split(os.EOL);

Ceci est généralement plus utile pour construire des chaînes de sortie à partir de Node, pour la portabilité de la plate-forme.


5
Ouais, vous ne devriez généralement pas faire ça. Vous devez analyser les nouvelles lignes quelle que soit la plate-forme.
1j01 du

Je souligne que c'est spécifiquement pour le cas des fichiers natifs de votre système dans la toute première phrase. La réponse ci-dessus est appropriée lorsque cela est inconnu ou mélangé.
qubyte

Droite. Ou quand c'est "connu" maintenant mais pourrait changer dans le futur.
1j01

ne fonctionne que lors du chargement de fichiers sur la plate-forme sur laquelle ils ont été créés.
Spongman

34

Il ressemble à regex /\r\n|\r|\n/gère les fins de ligne CR, LF et CRLF, leurs séquences mixtes, et garde toutes les lignes vides entre elles. Essayez ça!

function splitLines(t) { return t.split(/\r\n|\r|\n/); }

// single newlines
splitLines("AAA\rBBB\nCCC\r\nDDD");
// double newlines
splitLines("EEE\r\rFFF\n\nGGG\r\n\r\nHHH");
// mixed sequences
splitLines("III\n\r\nJJJ\r\r\nKKK\r\n\nLLL\r\n\rMMM");

Vous devriez obtenir ces tableaux en conséquence:

[ "AAA", "BBB", "CCC", "DDD" ]
[ "EEE", "", "FFF", "", "GGG", "", "HHH" ]
[ "III", "", "JJJ", "", "KKK", "", "LLL", "", "MMM" ]

Vous pouvez également apprendre à cette regex à reconnaître d'autres terminateurs de ligne Unicode légitimes en ajoutant |\xHHou |\uHHHHparts, où Hsont les chiffres hexadécimaux du point de code du caractère de terminaison supplémentaire (comme vu dans l'article de Wikipedia sous U+HHHH).


30
a = a.split("\n");

Notez que splitting renvoie le nouveau tableau, plutôt que de l'affecter simplement à la chaîne d'origine. Vous devez le stocker explicitement dans une variable.


17

Une solution qui fonctionne avec toutes les fins de ligne possibles, y compris les terminaisons mixtes et en gardant également les lignes vides, peut être obtenue en utilisant deux remplacements et un fractionné comme suit

text.replace(/\r\n/g, "\r").replace(/\n/g, "\r").split(/\r/);

du code pour le tester

  var CR = "\x0D";  //   \r
  var LF = "\x0A";  //   \n

  var mixedfile = "00" + CR + LF +            // 1 x win
                  "01" + LF +                 // 1 x linux
                  "02" + CR +                 // 1 x old mac
                  "03" + CR + CR +            // 2 x old mac
                  "05" + LF + LF +            // 2 x linux
                  "07" + CR + LF + CR + LF +  // 2 x win
                  "09";

  function showarr (desc, arr)
  {
     console.log ("// ----- " + desc);
     for (var ii in arr)
        console.log (ii + ") [" + arr[ii] +  "] (len = " + arr[ii].length + ")");
  }

  showarr ("using 2 replace + 1 split", 
           mixedfile.replace(/\r\n/g, "\r").replace(/\n/g, "\r").split(/\r/));

et la sortie

  // ----- using 2 replace + 1 split
  0) [00] (len = 2)
  1) [01] (len = 2)
  2) [02] (len = 2)
  3) [03] (len = 2)
  4) [] (len = 0)
  5) [05] (len = 2)
  6) [] (len = 0)
  7) [07] (len = 2)
  8) [] (len = 0)
  9) [09] (len = 2)

1
En fait, la solution donnée par blakkwater: text.split (/ \ r \ n | \ n | \ r /); faites de même et c'est plus court et plus rapide
Alejadro Xalabarder

7

Le premier devrait fonctionner:

> "a\nb".split("\n");
[ 'a', 'b' ]
> var a = "test.js\nagain.js"
undefined
> a.split("\n");
[ 'test.js', 'again.js' ]

4

J'ai créé un eolmodule pour travailler avec les fins de ligne dans les nœuds ou les navigateurs. Il a une méthode fractionnée comme

var lines = eol.split(text)

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.