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


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

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.


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


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.


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)

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

4

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

var lines = eol.split(text)
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.