노드에서 줄 바꿈 ( '\ n')으로 문자열을 나누는 방법은 무엇입니까?


136

노드에서 줄 바꿈 ( '\ 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

이것은 node.js 태그가 필요없는 순수한 JavaScript 질문처럼 보입니다.
Wyck

답변:


239

/\r?\n/Windows 및 UNIX 시스템에서 모두 사용할 수 있는 정규식으로 분할하십시오 .

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

3
클래식 맥은 어떻습니까? ;)
AshleyF

10
클래식 맥은 스티브 잡스와 함께 죽었다 ... 슬픔 :(
ymz

43
\ n, \ r 및 \ r \ n 잡기 :split(/[\r\n]+/)
Julian TF

2
MacOSX는 더 이상 하나의 \ r을 사용하지 않습니다. 그것은 오래된 Mac에서만 사용되었습니다. 다른 유닉스와 같은 \ n을 가지고 있다고 생각합니다.
jcubic

12
/ [\ r \ n] + /는 빈 줄을 걸러냅니다
Spongman

49

파일이 시스템 고유 파일 인 경우 (확실히 보장 할 수 없음) Node가 다음을 수행 할 수 있습니다.

var os = require('os');

a.split(os.EOL);

이것은 일반적으로 플랫폼 이식성을 위해 노드에서 출력 문자열 을 구성하는 데 더 유용 합니다.


5
예, 일반적으로이 작업을 수행해서는 안됩니다. 플랫폼에 관계없이 줄 바꿈을 구문 분석해야합니다.
1j01

나는 이것이 첫 문장에서 시스템 고유 파일의 경우를 위해 특별히 강조된다. 위의 답변은 이것이 알려지지 않았거나 혼합 된 경우에 적합합니다.
qubyte

권리. 또는 지금은 "알려"있지만 앞으로 변경 될 수 있습니다.
1j01

작성된 플랫폼에서 파일을로드 할 때만 작동합니다.
스폰지 맨

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" ]

또한 정규식 이 추가 터미네이터 문자 코드 포인트의 16 진 숫자 인 Wikipedia 기사에서 볼 수있는 것처럼 또는 부분 을 추가하여 다른 합법적 인 유니 코드 줄 터미네이터 를 인식하도록 가르 칠 수 있습니다 .|\xHH|\uHHHHHU+HHHH


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

참고 split그냥 원래 문자열에 할당하기보다는, 팅 새로운 배열을 반환합니다. 변수에 명시 적으로 저장해야합니다.


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

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.