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.


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' ]

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.


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).


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.


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)

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' ]

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)
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.