ノードで文字列を改行( '\ n')で分割する方法は?


135

ノードで文字列を改行( '\ 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 2014

これは、node.jsタグを必要としない純粋なJavaScriptの質問のように見えます。
Wyck

回答:


238

/\r?\n/WindowsシステムとUNIXシステムの両方で使用できるように、正規表現で分割してみてください。

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

3
クラシックMacはどうですか?;)
AshleyF 2015年

10
クラシックマックはスティーブジョブズと共に亡くなりました...悲しみ:(
ymz

43
\ n、\ r、\ r \ nをキャッチするには:split(/[\r\n]+/)
Julian TF

2
MacOSXは、単一の\ rをもう使用しません。これは、古いMacでのみでした。他のUNIXと同じ\ nだと思います。
jcubic 2017

12
/ [\ r \ n] + /は空行を除外します
Spongman '7/07/18

49

ファイルがシステムにネイティブである場合(確かにそれが保証されていない場合)、Nodeが役立ちます。

var os = require('os');

a.split(os.EOL);

これは通常、プラットフォームの移植性のために、Nodeから出力文字列を作成する場合により便利です。


5
ええ、あなたは一般的にこれを行うべきではありません。プラットフォームに関係なく改行を解析する必要があります。
1j01

最初の文で、これがシステム固有のファイルの場合に特に当てはまることを強調します。上記の答えは、これが不明または混合である場合に適しています。
キューバイト

正しい。または、現在「既知」であるが将来変更される可能性がある場合。
1j01

ファイルが作成されたプラットフォームでファイルをロードするときにのみ機能します。
スポンマン2018

33

正規表現/\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行終端文字を認識するように教えることもできます。ここで、は追加の終端文字コードポイントの16進数字です(Wikipediaの記事でとして見られます)。|\xHH|\uHHHHHU+HHHH


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

splittingは、元の文字列に割り当てるだけでなく、新しい配列を返すことに注意してください。明示的に変数に格納する必要があります。


17

次のように2つの置換と1つの分割を使用して、混合行を含むすべての可能な行末で動作し、空行を維持するソリューションを実現できます。

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

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)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.