Làm thế nào trong nút để phân tách chuỗi theo dòng mới ('\ n')?


135

Làm thế nào trong nút để phân tách chuỗi theo dòng mới ('\ n')? Tôi có chuỗi đơn giản như var a = "test.js\nagain.js"và tôi cần phải có được ["test.js", "again.js"]. Tôi đã thử

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

nhưng không có cái nào ở trên không hoạt động.



7
split()không sửa đổi chuỗi gốc.
Junaskell

Điều này trông giống như một câu hỏi JavaScript thuần túy, không yêu cầu thẻ node.js.
Wyck

Câu trả lời:


238

Hãy thử chia nhỏ trên một biểu thức chính quy /\r?\n/để có thể sử dụng được bởi cả hai hệ thống Windows và UNIX.

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

3
Còn máy Mac cổ điển thì sao? ;)
AshleyF 7/11/2015

10
Máy Mac cổ điển đã chết cùng với Steve Jobs ... nỗi buồn :(
ymz

43
để bắt \ n, \ r và \ r \ n:split(/[\r\n]+/)
Julian TF

2
MacOSX không sử dụng một lần nữa, chỉ dành cho các máy Mac cũ. Tôi nghĩ rằng chúng có cùng \ n như các unix khác.
jcubic

12
/ [\ r \ n] + / sẽ lọc ra các dòng trống
Spongman

49

Nếu tệp có nguồn gốc từ hệ thống của bạn (chắc chắn không có gì đảm bảo về điều đó), thì Node có thể giúp bạn thoát ra:

var os = require('os');

a.split(os.EOL);

Điều này thường hữu ích hơn cho việc xây dựng các chuỗi đầu ra từ Node, cho tính di động của nền tảng.


5
Vâng, bạn thường không nên làm điều này. Bạn nên phân tích các dòng mới bất kể nền tảng.
1j01

Tôi nhấn mạnh rằng đây là đặc biệt cho trường hợp các tệp có nguồn gốc trong hệ thống của bạn trong câu đầu tiên. Câu trả lời ở trên là thích hợp khi điều này chưa biết hoặc hỗn hợp.
qubyte

Đúng. Hoặc khi nó "được biết" bây giờ nhưng có thể thay đổi trong tương lai.
1j01

chỉ hoạt động khi tải tệp trên nền tảng mà chúng được tạo.
Spongman

33

Dường như regex /\r\n|\r|\n/xử lý các kết thúc dòng CR, LF và CRLF, các chuỗi hỗn hợp của chúng và giữ tất cả các dòng trống ở giữa. Hãy thử điều đó!

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

Bạn sẽ nhận được các mảng như là kết quả:

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

Bạn cũng có thể dạy regex đó nhận ra các đầu cuối dòng Unicode hợp pháp khác bằng cách thêm |\xHHhoặc |\uHHHHcác phần, trong đó Hlà các chữ số thập lục phân của mã ký tự kết thúc bổ sung (như đã thấy trong bài viết Wikipedia như U+HHHH).


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

Lưu ý rằng splitting trả về mảng mới, thay vì chỉ gán nó cho chuỗi gốc. Bạn cần lưu trữ nó một cách rõ ràng trong một biến.


17

Một giải pháp hoạt động với tất cả các kết thúc dòng có thể bao gồm cả các kết hợp hỗn hợp và giữ các dòng trống cũng có thể đạt được bằng cách sử dụng hai thay thế và một phân chia như sau

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

một số mã để kiểm tra nó

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

và đầu ra

  // ----- 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
Trên thực tế, giải pháp được đưa ra bởi blakkwater: text.split (/ \ r \ n | \ n | \ r /); làm tương tự và nó ngắn hơn và nhanh hơn
Alejadro Xalabarder

7

Người đầu tiên nên làm việc:

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

4

Tôi đã tạo một eolmô-đun để làm việc với các kết thúc dòng trong nút hoặc trình duyệt. Nó có một phương thức phân chia như

var lines = eol.split(text)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.