Bagaimana dalam simpul untuk membagi string dengan baris baru ('\ n')?

135

Bagaimana dalam simpul untuk membagi string dengan baris baru ('\ n')? Saya memiliki string sederhana seperti var a = "test.js\nagain.js"dan saya perlu mendapatkannya ["test.js", "again.js"]. Saya mencoba

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

tetapi tidak ada yang di atas tidak bekerja

PaolaJ.
sumber
kemungkinan duplikat karakter JavaScript string?
Mene
7
split()tidak mengubah string asli.
thgaskell
Ini terlihat seperti pertanyaan JavaScript murni, tidak memerlukan tag node.js.
Wyck

Jawaban:

238

Coba pisahkan pada regex yang ingin /\r?\n/digunakan oleh sistem Windows dan UNIX.

> "a\nb\r\nc".split(/\r?\n/)
[ 'a', 'b', 'c' ]
maerics
sumber
3
Bagaimana dengan Mac klasik? ;)
AshleyF
10
Mac klasik meninggal bersama dengan Steve Jobs ... kesedihan :(
ymz
43
untuk menangkap \ n, \ r dan \ r \ n:split(/[\r\n]+/)
Julian TF
2
MacOSX tidak menggunakan tunggal lagi, itu hanya untuk Mac lama. Saya pikir mereka memiliki \ n yang sama seperti unix lainnya.
jcubic
12
/ [\ r \ n] + / akan menyaring baris kosong
Spongman
49

Jika file tersebut asli dari sistem Anda (tentu saja tidak ada jaminan), maka Node dapat membantu Anda:

var os = require('os');

a.split(os.EOL);

Ini biasanya lebih berguna untuk membangun string keluaran dari Node, untuk portabilitas platform.

qubyte
sumber
5
Ya, Anda biasanya tidak boleh melakukan ini. Anda harus mengurai baris baru terlepas dari platform.
1j01
Saya menyoroti bahwa ini khusus untuk kasus file asli ke sistem Anda pada kalimat pertama. Jawaban di atas tepat untuk saat ini tidak diketahui atau dicampur.
qubyte
Baik. Atau ketika "dikenal" sekarang tetapi mungkin berubah di masa depan.
1j01
hanya berfungsi saat memuat file pada platform tempat mereka dibuat.
Spongman
33

Sepertinya regex /\r\n|\r|\n/menangani akhiran garis CR, LF, dan CRLF, urutan campurannya, dan menjaga semua garis kosong di antara. Coba itu!

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

Anda harus mendapatkan array ini sebagai hasilnya:

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

Anda juga dapat mengajarkan regex untuk mengenali terminator Unicode line sah lainnya dengan menambahkan |\xHHatau |\uHHHHbagian, di mana Hdigit heksadesimal dari codepoint karakter terminator tambahan (seperti yang terlihat dalam artikel Wikipedia sebagai U+HHHH).

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

Perhatikan bahwa splitting mengembalikan array baru, bukan hanya menetapkannya ke string asli. Anda perlu menyimpannya secara eksplisit dalam sebuah variabel.

alex
sumber
17

Sebuah solusi yang bekerja dengan semua kemungkinan akhir garis termasuk yang campuran dan menjaga garis kosong juga dapat dicapai dengan menggunakan dua penggantian dan satu pemecahan sebagai berikut

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

beberapa kode untuk mengujinya

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

dan hasilnya

  // ----- 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
sumber
1
Sebenarnya solusi yang diberikan oleh blakkwater: text.split (/ \ r \ n | \ n | \ r /); lakukan hal yang sama dan lebih pendek dan lebih cepat
Alejadro Xalabarder
7

Yang pertama harus bekerja:

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

Saya membuat eolmodul untuk bekerja dengan ujung baris di node atau browser. Ini memiliki metode split seperti

var lines = eol.split(text)
ryanve
sumber