如何在节点中用换行符(’n’)拆分字符串?

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

但是上面的方法不起作用。

243696 次浏览

第一种方法应该奏效:

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

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

尝试在像 /\r?\n/这样的正则表达式上进行分割,以便 Windows 和 UNIX 系统都可以使用。

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

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

var os = require('os');


a.split(os.EOL);

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

我制作了一个 eol模块,用于在节点或浏览器中处理行结尾

var lines = eol.split(text)

一个适用于所有可能的行结尾的解决方案,包括 混合的,并保持空行,以及可以实现使用 两个替换和一个拆分,如下所示

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)

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

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