Wie im Knoten, um Zeichenfolge nach Zeilenumbruch ('\ n') zu teilen?

134

Wie im Knoten, um Zeichenfolge nach Zeilenumbruch ('\ n') zu teilen? Ich habe einfache Zeichenfolge wie var a = "test.js\nagain.js"und ich muss bekommen ["test.js", "again.js"]. Ich habe es versucht

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

aber keines der oben genannten funktioniert nicht.

PaolaJ.
quelle
Mögliches Duplikat des Zeilenumbruchzeichens
Mene
7
split()ändert die ursprüngliche Zeichenfolge nicht.
Thgaskell
Dies sieht aus wie eine reine JavaScript-Frage, für die kein node.js-Tag erforderlich ist.
Wyck

Antworten:

238

Versuchen Sie, einen regulären Ausdruck aufzuteilen /\r?\n/, der sowohl von Windows- als auch von UNIX-Systemen verwendet werden kann.

> "a\nb\r\nc".split(/\r?\n/)
[ 'a', 'b', 'c' ]
Maerics
quelle
3
Was ist mit klassischen Macs? ;)
AshleyF
10
klassische Macs starben zusammen mit Steve Jobs ... Traurigkeit :(
ymz
43
zu fangen \ n, \ r und \ r \ n:split(/[\r\n]+/)
Julian TF
2
MacOSX verwendet nicht mehr single \ r, das war nur für alte Macs. Ich denke, sie haben die gleichen \ n wie andere Unixe.
Jcubic
12
/ [\ r \ n] + / filtert leere Zeilen heraus
Spongman
49

Wenn die Datei in Ihrem System nativ ist (sicherlich keine Garantie dafür), kann Node Ihnen helfen:

var os = require('os');

a.split(os.EOL);

Dies ist normalerweise nützlicher für die Erstellung von Ausgabezeichenfolgen aus Node, um die Plattformportabilität zu gewährleisten.

qubyte
quelle
5
Ja, das solltest du im Allgemeinen nicht tun. Sie sollten Zeilenumbrüche unabhängig von der Plattform analysieren.
1j01
Ich hebe hervor, dass dies speziell für den Fall von Dateien gilt, die im ersten Satz in Ihrem System enthalten sind. Die obige Antwort ist angemessen, wenn dies unbekannt oder gemischt ist.
Qubyte
Richtig. Oder wenn es jetzt "bekannt" ist, sich aber in Zukunft ändern könnte.
1j01
Funktioniert nur beim Laden von Dateien auf der Plattform, auf der sie erstellt wurden.
Spongman
32

Es sieht so aus, als würde Regex /\r\n|\r|\n/die Zeilenenden CR, LF und CRLF, ihre gemischten Sequenzen, behandeln und alle leeren Zeilen dazwischen behalten. Versuch das!

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

Sie sollten diese Arrays als Ergebnis erhalten:

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

Sie können diesem regulären Ausdruck auch beibringen, andere legitime Unicode-Zeilenendezeichen zu erkennen, indem Sie |\xHHoder |\uHHHHTeile hinzufügen , wobei Hes sich um hexadezimale Ziffern des zusätzlichen Codezeichens für Abschlusszeichen handelt (siehe Wikipedia-Artikel als U+HHHH).

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

Beachten Sie, dass splitting das neue Array zurückgibt, anstatt es nur der ursprünglichen Zeichenfolge zuzuweisen. Sie müssen es explizit in einer Variablen speichern.

Alex
quelle
17

Eine Lösung, die mit allen möglichen Zeilenenden einschließlich gemischter Zeilen funktioniert und auch leere Zeilen beibehält, kann wie folgt durch zwei Ersetzungen und eine Aufteilung erreicht werden

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

etwas Code, um es zu testen

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

und die Ausgabe

  // ----- 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)
Alejadro Xalabarder
quelle
1
Eigentlich die von blakkwater gegebene Lösung: text.split (/ \ r \ n | \ n | \ r /);
Machen Sie
7

Der erste sollte funktionieren:

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

Ich habe ein eolModul für die Arbeit mit Zeilenenden in Knoten oder Browsern erstellt. Es hat eine Split-Methode wie

var lines = eol.split(text)
Ryanve
quelle