如何在节点中通过换行符('\ n')拆分字符串?


134

如何在节点中用换行符('\ 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

Answers:


238

尝试在正则表达式上进行拆分,/\r?\n/以使其可同时在Windows和UNIX系统上使用。

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

3
那经典Mac呢?;)
AshleyF 2015年

10
经典的Mac电脑与史蒂夫·乔布斯(Steve Jobs)一同去世...悲伤:(
ymz

43
捕捉\ n,\ r和\ r \ n:split(/[\r\n]+/)
朱利安TF

2
MacOSX不再使用单个\ r,仅用于旧Mac。我认为它们与其他Unix具有相同的\ n。
jcubic

12
/ [\ r \ n] + /将过滤掉空行
Spongman

49

如果文件是系统的本机文件(肯定不能保证),那么Node可以为您提供帮助:

var os = require('os');

a.split(os.EOL);

对于平台可移植性来说,这通常对于从Node 构造输出字符串更有用。


5
是的,您通常不应该这样做。无论平台如何,都应解析换行符。
2016年

在第一句话中,我着重指出这是专门针对系统本地文件的情况。上面的答案适用于未知或混合的情况。
qubyte

对。或现在“知道”但将来可能会更改。
1j01

仅当在创建文件的平台上加载文件时才起作用。
Spongman '18年

32

看起来正则表达式/\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行终止符,其中s是附加终止符字符代码点的十六进制数字(如Wikipedia文章中所述)。|\xHH|\uHHHHHU+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 '19

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)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.