줄로 분할 할 JS 정규식


78

긴 텍스트를 어떻게 별도의 줄로 분할합니까? 이것이 line1을 두 번 반환하는 이유는 무엇 입니까?

/^(.*?)$/mg.exec('line1\r\nline2\r\n');

[ "line1", "line1"]

나는 확인하기 위해 멀티 라인 수정에 설정 ^하고 $시작하여 라인의 끝과 일치. 또한 모든 라인 을 캡처하기 위해 전역 수정자를 켰습니다 .

정규식 분할을 사용하고 싶지만 String.splitLinux \n와 Windows \r\n줄 끝 을 모두 다룰 것이기 때문이 아닙니다 .

답변:


146
arrayOfLines = lineString.match(/[^\r\n]+/g);

Tim이 말했듯이, 그것은 전체 경기이자 캡처입니다. regex.exec(string)전역 수정 자에 관계없이 첫 번째 일치 항목을 찾으면 반환되는 것으로 보입니다 string.match(regex). Wheras 는 전역을 존중합니다.


9
참고로 Tim은 빈 줄과 일치하지만 내 줄은 일치하지 않습니다. 어느 쪽이든 바람직 할 수도 있고 아닐 수도 있습니다.
ReactiveRaven

오래된 대답이지만 exec첫 번째 일치에서 반환 되는 이유 는 전역 정규식에 대해 여러 번 호출되기 때문에 null을 반환하고 정규식 lastIndex은 다음을 시작할 인덱스 와 같은 것을 저장하기 때문이라고 말하고 싶습니다. 시합.
iPherian

"123\n\n1234".match(/[^\r\n]+/g);예상을 시도 Array [ "123", "", "1234" ]했지만 얻었습니다Array [ "123", "1234" ]
sea-kg

105

사용하다

result = subject.split(/\r?\n/);

정규식은 전체 일치 첫 번째 캡처 그룹의 내용 모두 line1이므로 두 번 반환 됩니다 .line1


4
g플래그 를 사용해야하며 \r일부 오래된 애플 머신에서 유효한 개행 문자입니다. 또한 유니 코드는 \u2028, \u2029및 이전 IBM 개행 \u0085을 개행 으로 정의합니다 . 따라서 /[\n\u0085\u2028\u2029]|\r\n?/g모든 엣지 케이스를 처리합니다.
Mike Samuel

7
@Mike : /g깃발 에 대해 확실 합니까? 달리 명시하지 않는 한 한 번만 분할되는 분할 함수를 갖는 것은 의미가 없습니다. 그리고 Jojo는 그가 Linux와 Windows만을 다루고 있다고 말했습니다. 다음은 EBCDIC?
Tim Pietzcker

4
@Mike : 아니요, /g플래그는 필요하지 않습니다. 추가 할 수 있지만 JavaScript는이를 무시합니다. Tim이 말했듯이 기본 동작은 가능한 한 여러 번 분할하는 것이지만 두 번째 인수를 사용하여 최대 값을 부과 할 수 있습니다.
Alan Moore

23
개행을 구성하는 것은 그것보다 더 나쁩니다. Unicode Consortium 에 따르면 (\r\n|[\n\v\f\r\x85\u2028\u2029])소프트웨어가 실행되는 플랫폼이나 데이터의 출처에 관계없이 항상를 사용해야합니다 .
Alan Moore

@Alan, 맞습니다. g포착 기 여부 플래그 제어는 출력에 포함된다.
Mike Samuel

26

나는 다음이 개행을 구성한다고 가정합니다.

  1. \ r 뒤에 \ n
  2. \ n 뒤에 \ r
  3. \ n 혼자서
  4. \ r 혼자서

사용하시기 바랍니다

var re=/\r\n|\n\r|\n|\r/g;

arrayofLines=lineString.replace(re,"\n").split("\n");

빈 라인을 포함한 모든 라인의 배열.

또는

사용하시기 바랍니다

arrayOfLines = lineString.match(/[^\r\n]+/g); 

비어 있지 않은 라인의 배열


\n다음에 \r하나의 줄 바꿈없는
JLRishe

22

동일한 파일에 혼합 된 경우에도 모든 줄 끝 조합을 처리하고 빈 줄도 제거하는 더 간단한 정규식 :

var lines = text.split(/[\r\n]+/g);

공백 트리밍 :

var lines = text.trim().split(/\s*[\r\n]+\s*/g);


1
첫 번째는 텍스트 중간의 빈 줄을 제거하지만 시작이나 끝 부분은 제거하지 않습니다. 제 목적에는 괜찮습니다. 일관성을 유지하기 위해 제거가 필요한 모든 사람을 위해 지적하는 것입니다.
twm

6

우선 교체 \r\n로를 \n, 다음 String.split .


두 가지 명령이 필요합니다. 하나의 명령으로 정규식으로 수행 할 수 있습니까?
JoJo

2
@JoJo : myString.replace(/\r\n/, "\n").split("\n")(학업 적 관심 때문에 물어 보지 않는 한 :))
Tim

'line1\r\nline2\r\n'.replace(/\r\n/, '\n').split('\n').without('');잘못된 두 번째 셀을 생성합니다.["line1", "line2\r"]
JoJo

@JoJo : 죄송합니다. /g글로벌 플래그를 잊어 버렸습니다 ! 그것은해야한다 :myString.replace(/\r\n/g, "\n").split("\n")

3
@Jojo : 이것은 간결하게 한 줄로 요약됩니다. :) 정규식은 모든 작업을위한 도구가 아닙니다. 매우 강력 할 수 있지만 모든 곳에서 사용해서는 안됩니다. 참고 replace 이다 정규식.
Tim

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.