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


136

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

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

แต่ไม่มีข้อใดข้างต้นไม่ได้ผล


เป็นไปได้ที่จะซ้ำกันของอักขระบรรทัดใหม่
เมเน

7
split()ไม่แก้ไขสตริงเดิม
thgaskell

ดูเหมือนคำถาม JavaScript ล้วนๆไม่ต้องการแท็ก node.js
Wyck

คำตอบ:


239

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

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

3
แล้ว Mac แบบคลาสสิกล่ะ? ;)
AshleyF

10
Macs คลาสสิกเสียชีวิตไปพร้อมกับ Steve Jobs ... ความเศร้า :(
ymz

43
จับ \ n, \ r และ \ r \ n:split(/[\r\n]+/)
Julian TF

2
MacOSX ไม่ได้ใช้ single \ r อีกต่อไปซึ่งมีไว้สำหรับ Mac รุ่นเก่าเท่านั้น ฉันคิดว่าพวกมันมี \ n เหมือนกับยูนิกซ์อื่น ๆ
jcubic

12
/ [\ r \ n] + / จะกรองบรรทัดว่างออก
Spongman

49

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

var os = require('os');

a.split(os.EOL);

ซึ่งโดยปกติแล้วจะมีประโยชน์มากกว่าสำหรับการสร้างสตริงเอาต์พุตจากโหนดสำหรับการพกพาแพลตฟอร์ม


5
ใช่โดยทั่วไปคุณไม่ควรทำเช่นนี้ คุณควรแยกวิเคราะห์บรรทัดใหม่โดยไม่คำนึงถึงแพลตฟอร์ม
1j01

ฉันเน้นว่านี่เป็นกรณีเฉพาะสำหรับกรณีของไฟล์ที่อยู่ในระบบของคุณในประโยคแรก คำตอบข้างต้นเหมาะสำหรับเมื่อไม่ทราบหรือผสมกัน
qubyte

ขวา. หรือเมื่อ "ทราบ" แล้ว แต่อาจมีการเปลี่ยนแปลงในอนาคต
1j01

ใช้งานได้เฉพาะเมื่อโหลดไฟล์บนแพลตฟอร์มที่สร้างขึ้น
Spongman

34

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

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

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

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

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


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

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


17

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

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)

1
จริงๆแล้ววิธีแก้ปัญหาที่กำหนดโดย blakkwater: text.split (/ \ r \ n | \ n | \ r /); ทำแบบเดียวกันและสั้นกว่าและเร็วกว่า
Alejadro Xalabarder

7

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

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

4

ฉันสร้างeolโมดูลสำหรับทำงานกับส่วนท้ายบรรทัดในโหนดหรือเบราว์เซอร์ มันมีวิธีการแยกเช่น

var lines = eol.split(text)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.