web-dev-qa-db-fra.com

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

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

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

mais aucun des précédents ne fonctionne.

106
PaolaJ.

Essayez de séparer sur une expression rationnelle telle que /\r?\n/ pour pouvoir être utilisée par les systèmes Windows et UNIX.

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

Si le fichier est natif sur votre système (ce n’est certainement pas garanti), alors Node peut vous aider:

var os = require('os');

a.split(os.EOL);

Ceci est généralement plus utile pour la construction de sortie chaînes de Node bien que, pour la portabilité de la plate-forme.

38
qubyte
a = a.split("\n");

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

26
alex

Une solution qui fonctionne avec toutes les fins de ligne possibles, y compris les extrémités mixtes, tout en conservant les lignes vides, peut être obtenue en utilisant deux remplacements et une division 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)
16

Il semble que regex /\r\n|\r|\n/ gère les fins de ligne CR, LF et CRLF, leurs séquences mélangées, et conserve toutes les lignes vides entre les deux. 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 à la suite:

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

Vous pouvez également apprendre à cette expression rationnelle à reconnaître d'autres parties terminaisons de ligne Unicode en ajoutant |\xHH ou |\uHHHH parties, où H sont des chiffres hexadécimaux du point de code de caractère de terminaison supplémentaire (comme on le voit dans l'article Wikipedia sous le nom U+HHHH).

11
blakkwater

Le premier devrait fonctionner:

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

J'ai créé un eol module pour travailler avec les fins de ligne dans les noeuds ou les navigateurs. Il a une méthode de partage comme

var lines = eol.split(text)
4
ryanve