Как в узле разбить строку по новой строке ('\ 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");

но ничего из вышеперечисленного не работает.

PaolaJ.
источник
возможный дубликат символа новой строки JavaScript?
Мен
7
split()не изменяет исходную строку.
thgaskell
Это похоже на чистый вопрос JavaScript, не требующий тега node.js.
Вик

Ответы:

239

Попробуйте разделить на регулярные выражения, /\r?\n/чтобы их можно было использовать в системах Windows и UNIX.

> "a\nb\r\nc".split(/\r?\n/)
[ 'a', 'b', 'c' ]
maerics
источник
3
А как насчет классических Mac? ;)
AshleyF
10
классические Маки умерли вместе со Стивом Джобсом ... печаль :(
ymz
43
поймать \ n, \ r и \ r \ n:split(/[\r\n]+/)
Джулиан Т.Ф.
2
MacOSX больше не использует single \ r, это было только для старых Mac. Я думаю, что они имеют такой же \ n, как и другие юниксы.
jcubic
12
/ [\ r \ n] + / отфильтрует пустые строки
Spongman
49

Если файл является родным для вашей системы (конечно, нет никаких гарантий), то Node может помочь вам:

var os = require('os');

a.split(os.EOL);

Это обычно более полезно для построения выходных строк из Node, хотя для переносимости платформы.

qubyte
источник
5
Да, ты вообще не должен этого делать. Вы должны анализировать переводы строк независимо от платформы.
1j01
Я подчеркиваю, что это специально для случая файлов, родных для вашей системы, в самом первом предложении. Ответ выше подходит для случаев, когда это неизвестно или смешано.
кв. В
Правильно. Или когда это «известно» сейчас, но может измениться в будущем.
1j01
работает только при загрузке файлов на платформе, на которой они были созданы.
Spongman
34

Похоже, регулярное выражение /\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).

blakkwater
источник
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 /); сделать то же самое, и это короче и быстрее
Алехадро Xalabarder
7

Первый должен работать:

> "a\nb".split("\n");
[ 'a', 'b' ]
> var a = "test.js\nagain.js"
undefined
> a.split("\n");
[ 'test.js', 'again.js' ]
TimWolla
источник
4

Я сделал eolмодуль для работы с окончаниями строк в узле или браузерах. У него есть метод разделения, как

var lines = eol.split(text)
ryanve
источник
-1

.split (String.fromCharCode (10))

user14048856
источник
2
Этот ответ бесполезен, так как он эквивалентен split("\n").
Д. Пардал
1
Пожалуйста, объясните, запись отмечена как не требующая больших усилий.
Бросил