ค้นหาเว็บไซต์

javascript - วิธีแยกสตริงด้วยการขึ้นบรรทัดใหม่ ('\n') ใน Node?


ภายใน Node, ฉันจะแยกสตริงโดยใช้ newline ('\n') ได้อย่างไร? ฉันมีสตริงง่ายๆ แบบ var a="test.js\nagain.js" และฉันต้องการได้ ["test.js", "again.js"] ฉันได้ลอง

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

แต่สิ่งที่กล่าวมาข้างต้นไม่ทำงาน

คำตอบ #1

ลองแยกโดยใช้ regex เช่น /\r?\n/ เพื่อให้ใช้งานได้ทั้งระบบ Windows และ UNIX

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

คำตอบ #2

ถ้าไฟล์นั้นเป็นไฟล์ท้องถิ่นของระบบของคุณ (แน่นอนว่าไม่มีการรับประกันเรื่องนั้น) Node ก็สามารถช่วยคุณได้:

var os = require('os');

a.split(os.EOL);

นี่มักจะมีประโยชน์มากกว่าในการสร้างสตริง ผลลัพธ์ จาก Node สำหรับความสามารถในการใช้งานข้ามแพลตฟอร์ม

คำตอบ #3

ดูเหมือนว่า regex /\r\n|\r|\n/ จะจัดการกับการขึ้นบรรทัด CR, LF และ CRLF, ลำดับที่ผสมกันของพวกมัน และเก็บบรรทัดว่างทั้งหมดในระหว่าง ลองดูสิ!

    function splitLines(t) { return t.split(/\r\n|\r|\n/); }

    // single newlines
    console.log(splitLines("AAA\rBBB\nCCC\r\nDDD"));
    // double newlines
    console.log(splitLines("EEE\r\rFFF\n\nGGG\r\n\r\nHHH"));
    // mixed sequences
    console.log(splitLines("III\n\r\nJJJ\r\r\nKKK\r\n\nLLL\r\n\rMMM"));

คุณควรได้รับอาเรย์เหล่านี้เป็นผลลัพธ์:

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

คุณยังสามารถสอน regex นั้นให้รู้จักตัวจบบรรทัด Unicode ที่ถูกต้องอื่น ๆ ได้โดยการเพิ่ม |\xHH หรือ |\uHHHH ส่วนที่ H คือเลขฐานสิบหกของรหัสตัวอักษรตัวจบบรรทัดเพิ่มเติม (ดังที่เห็นในบทความวิกิพีเดียเป็น U+HHHH)

คำตอบ #4

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

สังเกตว่า split จะคืนค่าเป็นอาร์เรย์ใหม่ แทนที่จะเพียงแค่กำหนดให้กับสตริงต้นฉบับ คุณต้องเก็บมันไว้ในตัวแปรอย่างชัดเจน

คำตอบ #5

วิธีแก้ปัญหาที่สามารถใช้งานได้กับตัวจบบรรทัดทุกรูปแบบรวมถึงแบบผสม และยังคงรักษาบรรทัดว่างไว้ด้วย สามารถทำได้โดยใช้การแทนที่สองครั้งและการแยกหนึ่งครั้งดังนี้

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

โค้ดบางส่วนเพื่อทดสอบมัน

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

และผลลัพธ์

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

คำตอบ #6

อันแรกควรใช้ได้:

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

บทความที่เกี่ยวข้อง