Como no nó dividir a string por nova linha ('\ n')?

135

Como no nó dividir a string por nova linha ('\ n')? Eu tenho uma string simples var a = "test.js\nagain.js"e preciso obter ["test.js", "again.js"]. eu tentei

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

mas nenhuma das opções acima não funciona.

PaolaJ.
fonte
7
split()não modifica a sequência original.
thgaskell
Parece uma questão de JavaScript puro, não exigindo uma tag node.js.
Wyck

Respostas:

238

Tente dividir em um regex que /\r?\n/possa ser usado pelos sistemas Windows e UNIX.

> "a\nb\r\nc".split(/\r?\n/)
[ 'a', 'b', 'c' ]
maerics
fonte
3
E os Macs clássicos? ;)
AshleyF
10
Macs clássicos morreram junto com Steve Jobs ... tristeza :(
ymz 15/17
43
pegar \ n, \ re \ r \ n:split(/[\r\n]+/)
Julian TF
2
O MacOSX não usa mais single, isso era apenas para Macs antigos. Eu acho que eles têm o mesmo \ n que outros unixes.
Jcubic
12
/ [\ r \ n] + / filtrará as linhas vazias
Spongman 07/07
49

Se o arquivo for nativo do seu sistema (certamente não há garantias disso), o Node poderá ajudá-lo:

var os = require('os');

a.split(os.EOL);

Isso geralmente é mais útil para construir seqüências de saída do Node, para portabilidade da plataforma.

qubyte
fonte
5
Sim, você geralmente não deve fazer isso. Você deve analisar novas linhas, independentemente da plataforma.
1j01 5/11
Destaco que isso se aplica especificamente aos arquivos nativos do seu sistema na primeira frase. A resposta acima é apropriada para quando isso é desconhecido ou misto.
qubyte
Certo. Ou quando é "conhecido" agora, mas pode mudar no futuro.
1j01 6/11
só funciona ao carregar arquivos na plataforma em que foram criados.
Spongman 07/07/19
33

Parece que o regex /\r\n|\r|\n/lida com as terminações de linha CR, LF e CRLF, suas seqüências mistas e mantém todas as linhas vazias entre elas. Tente isso!

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

Você deve obter essas matrizes como resultado:

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

Você também pode ensinar esse regex a reconhecer outros terminadores de linha Unicode legítimos adicionando |\xHHou |\uHHHHpartes, onde Hsão dígitos hexadecimais do ponto de código do caractere terminador adicional (como visto no artigo da Wikipedia como U+HHHH).

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

Observe que splitting retorna a nova matriz, em vez de apenas atribuí-la à string original. Você precisa armazená-lo explicitamente em uma variável.

alex
fonte
17

Uma solução que funciona com todas as terminações de linhas possíveis, incluindo as misturadas e mantendo as linhas vazias, pode ser alcançada usando duas substituições e uma divisão, como segue

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

algum código para testá-lo

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

e a saída

  // ----- 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)
Alejadro Xalabarder
fonte
1
Na verdade, a solução dada por blakkwater: text.split (/ \ r \ n | \ n | \ r /); fazer o mesmo e ele é mais curto e mais rápido
Alejadro Xalabarder
7

O primeiro deve funcionar:

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

Eu criei um eolmódulo para trabalhar com terminações de linha em nós ou navegadores. Tem um método de divisão como

var lines = eol.split(text)
ryanve
fonte