Як у вузлі розділити рядок на новий рядок ('\ 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.
Вік

Відповіді:


239

Спробуйте розділити на регулярний вираз, як він /\r?\n/може бути використаний як Windows, так і UNIX.

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

3
Що з класичними Macs? ;)
AshleyF

10
класичний Мак загинув разом зі Стівом Джобсом ... смуток :(
ymz

43
зловити \ n, \ r і \ r \ n:split(/[\r\n]+/)
Джуліан TF

2
MacOSX більше не використовує одиночний файл, це було лише для старих Macs. Я думаю, вони мають такі ж \ n, що й інші Unix.
jcubic

12
/ [\ r \ n] + / викреслить порожні рядки
Спонгмен

49

Якщо файл є власною системою (напевно, гарантій на це немає), Node може допомогти вам:

var os = require('os');

a.split(os.EOL);

Це, як правило, більш корисно для побудови вихідних рядків з Node, але для портативності платформи.


5
Так, ти, як правило, не повинен цього робити. Ви повинні проаналізувати нові рядки незалежно від платформи.
1j01

Я підкреслюю, що це спеціально для файлів, які є рідними у вашій системі в першому реченні. Відповідь вище відповідна, коли це невідомо або змішано.
квіте

Правильно. Або коли це "відомо" зараз, але може змінитися в майбутньому.
1j01

працює лише під час завантаження файлів на платформі, на якій вони були створені.
Spongman

33

Схоже, регулярні вирази /\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" ]

Ви також можете навчити цей регулярний вираз розпізнавати інші легітимні термінатори Unicode , додавши |\xHHабо |\uHHHHчастини, де H- це шістнадцяткові цифри кодової точки додаткового символу термінатора (як видно в статті Вікіпедії як 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 /); зроби те саме, і це коротше і швидше
Алехадро Ксалабардер

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)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.