Come nel nodo suddividere la stringa per newline ('\ n')?


136

Come nel nodo suddividere la stringa per newline ('\ n')? Ho una stringa semplice come var a = "test.js\nagain.js"e ho bisogno di ottenere ["test.js", "again.js"]. Provai

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

ma nessuno dei precedenti non funziona.



7
split()non modifica la stringa originale.
Thgaskell,

Sembra una pura domanda JavaScript, che non richiede un tag node.js.
Wyck,

Risposte:


239

Prova a dividere un regex come se /\r?\n/fosse utilizzabile sia da sistemi Windows che UNIX.

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

3
Che dire dei Mac classici? ;)
AshleyF,

10
i Mac classici sono morti insieme a Steve Jobs ... tristezza :(
ymz

43
per catturare \ n, \ re \ r \ n:split(/[\r\n]+/)
Julian TF,

2
MacOSX non usa più single, solo per vecchi Mac. Penso che abbiano lo stesso \ n degli altri unix.
jcubic,

12
/ [\ r \ n] + / filtrerà le righe vuote
Spongman

49

Se il file è nativo del tuo sistema (sicuramente non ne è garantito), allora Node può aiutarti:

var os = require('os');

a.split(os.EOL);

Questo di solito è più utile per costruire stringhe di output da Nodo, per la portabilità della piattaforma.


5
Sì, generalmente non dovresti farlo. È necessario analizzare le nuove righe indipendentemente dalla piattaforma.
gennaio

Sottolineo che questo è specifico per il caso dei file nativi del tuo sistema nella prima frase. La risposta sopra è appropriata per quando questo è sconosciuto o misto.
qubyte

Destra. O quando è "conosciuto" ora ma potrebbe cambiare in futuro.
1o gennaio

funziona solo quando si caricano file sulla piattaforma su cui sono stati creati.
Spongman,

33

Sembra che regex /\r\n|\r|\n/gestisca le terminazioni di linea CR, LF e CRLF, le loro sequenze miste e mantenga tutte le linee vuote tra di loro. Prova questo!

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");

Di conseguenza, è necessario ottenere questi array:

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

Puoi anche insegnare a quel regex a riconoscere altri terminatori di linea Unicode legittimi aggiungendo |\xHHo |\uHHHHparti, dove Hsono cifre esadecimali del punto di codice carattere di terminazione aggiuntivo (come visto nell'articolo di Wikipedia come U+HHHH).


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

Si noti che splitting restituisce il nuovo array, piuttosto che assegnarlo semplicemente alla stringa originale. Devi memorizzarlo esplicitamente in una variabile.


17

Una soluzione che funziona con tutti i possibili finali di linea, compresi quelli misti e mantenendo anche le linee vuote, può essere ottenuta utilizzando due sostituzioni e una divisione come segue

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

del codice per testarlo

  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/));

e l'uscita

  // ----- 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
In realtà la soluzione data da blakkwater: text.split (/ \ r \ n | \ n | \ r /); fare lo stesso ed è più corto e più veloce
Alejadro Xalabarder,

7

Il primo dovrebbe funzionare:

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

4

Ho creato un eolmodulo per lavorare con le terminazioni di linea nel nodo o nei browser. Ha un metodo split come

var lines = eol.split(text)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.