如何在Node中用换行符('\n')分割字符串?

IT技术 javascript node.js
2021-03-14 23:48:45

在 Node 中,如何使用换行符 ('\n') 拆分字符串?我有一个简单的字符串var a = "test.js\nagain.js",我需要得到["test.js", "again.js"]. 我试过

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

但以上不起作用。

6个回答

尝试在/\r?\n/Windows 和 UNIX 系统都可以使用的正则表达式上进行拆分

> "a\nb\r\nc".split(/\r?\n/)
[ 'a', 'b', 'c' ]
经典的 Mac 怎么样?;)
2021-04-24 23:48:45
MacOSX 不再使用单个 \r,这仅适用于旧 Mac。我认为它们与其他 unix 具有相同的 \n。
2021-04-24 23:48:45
/[\r\n]+/ 将过滤掉空行
2021-04-25 23:48:45
捕捉\n、\r 和\r\n: split(/[\r\n]+/)
2021-05-02 23:48:45
经典的 Mac 和史蒂夫乔布斯一起死了......悲伤:(
2021-05-10 23:48:45

如果该文件是您系统的本机文件(当然不能保证),那么 Node 可以帮助您:

var os = require('os');

a.split(os.EOL);

不过,为了平台可移植性,这对于从 Node构建输出字符串通常更有用

仅在创建文件的平台上加载文件时才有效。
2021-04-28 23:48:45
适用于临时文件(?)
2021-04-30 23:48:45
是的,你通常不应该这样做。无论平台如何,您都应该解析换行符。
2021-05-12 23:48:45
对。或者当它现在“已知”但将来可能会改变时。
2021-05-12 23:48:45
我在第一句话中强调,这是专门针对系统本地文件的情况。上面的答案适用于未知或混合的情况。
2021-05-14 23:48:45

看起来正则表达式/\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" ]

您还可以教正则表达式通过添加部分来识别其他合法的Unicode 行终止符,其中's 是附加终止符字符代码点的十六进制数字(如维基百科文章中所见)。|\xHH|\uHHHHHU+HHHH

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

请注意,splitting 返回新数组,而不仅仅是将其分配给原始字符串。您需要将其显式存储在变量中。

可以使用以下两个替换和一个拆分来实现适用于所有可能的行结尾(包括混合行结尾并保留空行)的解决方案

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)
实际上blakkwater给出的解决方案: text.split(/\r\n|\n|\r/); 做同样的事情,它更短更快
2021-05-11 23:48:45