줄 바꿈과 일치-\ n 또는 \ r \ n?


159

이 답변을 쓰는 동안 s-flag (-dot dotallmatch linebreaks) 를 사용하는 대신 linebreaks에서만 독점적으로 일치해야했습니다 .

정규 표현식을 테스트하는 데 주로 사용되는 사이트는 \n또는 에서 일치하려고 할 때 다르게 동작합니다 \r\n.

나는 알아 차렸다

  • Regex101은 줄 바꿈 만 일치합니다 \n
    ( -삭제 \r및 일치)

  • RegExr는 줄 바꿈과 일치하는 \n \r\n
    나는, 그것은 LINEBREAK 일치하게 뭔가를 찾으를 제외 할 수 m-flag와 \s
    ( )

  • Debuggex 더욱 다양한 동작 :
    이 예 그것은 단지에 일치 \r\n하면서,
    여기에 단지에 일치 \n지정한 것과 동일한 플래그와 엔진,

나는 m-flag ( 여러 줄-줄 ^의 시작과 $끝을 일치시킵니다)를 완전히 알고 있지만 때로는 옵션이 아닙니다. \s탭과 공백도 일치하므로와 동일 합니다.

유니 코드 줄 바꿈 문자 ( \u0085) 를 사용하려는 생각이 성공하지 못했습니다.

  1. 줄 바꿈에서 일치를 정규식으로 통합하는 안전한 방법이 있습니까?
  2. 이유는 위에서 언급 한 사이트가 다르게 동작 할 (특히 Debuggex는 한 번 일치 만에 \n한 번 만에 \r\n)?

15
당신이 시도 할 수 [\r\n]+-이나 뭐 이런
일리아 Bursov

3
내가 사용 \r?\n모두 일치 \r\n하고 \n라인 종료 시퀀스를. 이전 \rMac 구문에서는 작동하지 않지만 요즘에는 매우 드 rare니다.
ridgerunner

6
안녕하세요, debuggex의 설립자입니다. 이것은 버그처럼 보입니다 (debuggex의 경우 다른 사람들과 이야기 할 수 없습니다). 이 질문을 참조하는 주요 문제를 추가했습니다. 우리는 가능한 한 빨리 그것을 얻을 것입니다-우리는 현재 (매우 제한된) 모든 리소스를 다른 제품을 출시하는 데 집중하고 있습니다.
Sergiu Toarca

2
@ridgerunner에 Mac의 구문을 추가하려면 (\ r? \ n | \ r) 할 수 있습니다. (\ r? \ n | \ r) Peter van der Wal의 대답과 비슷하지만 더 컴팩트합니다 (10 자 대 12 자).
Doktor J

답변:


220

반대 방향으로 대답합니다.

2)에 대한 자세한 설명은 \r\n: 내가 여기에 게시 할 예정보다 훨씬 더 완료 될 때이 질문을 참조 할 필요가 차이를 \ n과 \ 연구를?

간단히 말해 리눅스는 \n새로운 라인, Windows \r\n및 구형 Mac에 사용 \r합니다. 따라서 개행을 작성하는 여러 가지 방법이 있습니다. 두 번째 도구 (RegExr)는 예를 들어 single에서 일치합니다 \r.

1) [\r\n]+Ilya가 제안한대로 작동하지만 여러 개의 연속적인 새 줄과 일치합니다. (\r\n|\r|\n)더 정확합니다.


그래서 \r/ \n는 운영 체제에 따라 다릅니다-그것은 (;) 아는 것입니다-왜 두 개의 debuggex 예제가 \ r \ n에서 한 번, \ n에서 한 번 일치합니까? 적어도 나에게는 눈에 띄는 차이가 없습니다 (예제에서).
KeyNone

Windows 텍스트 편집기 중 하나를 복사하고 다른 하나는 debuggex 텍스트 영역에 직접 작성한 것 같습니다. 각각 다른 줄 바꿈을 사용했습니다.
OGHaza

1
실제로, 세 번째 예 (Senior men 's ...) \r\n에 텍스트 가 있기 때문에 (마우스 오른쪽 버튼을 클릭하고 소스를 표시하면 {{Infobox XC Championships\r\n|Name =어딘가에 있습니다). 두 번째 도구는 Flash로 작성되었으며 줄 바꿈 문자가있는 정보 페이지를 약간 버그가 있습니다.
피터 반 데르 월

1
(\r\n|\r|\n)더 간단하게 쓸 수 있습니다\r\n?
Asad Saeeduddin

2
@AsadSaeeduddin 안돼. \n
Peter van der Wal

12

Debuggex의 예제 텍스트에 다른 줄 끝이 있습니다. 특히 흥미로운 점은 Debuggex가 가장 먼저 사용한 줄 끝 스타일을 식별 한 것으로 보이며 입력 한 모든 추가 줄 끝을 해당 스타일로 변환합니다.

메모장 ++을 사용하여 Unix 및 Windows 형식의 샘플 텍스트를 Debuggex에 붙여 넣었으며, 가장 먼저 붙여 넣은 것은 Debuggex 세션이 붙은 것입니다.

따라서 텍스트를 Debuggex에 붙여 넣기 전에 텍스트 편집기를 통해 텍스트를 씻어야합니다. 원하는 스타일을 붙여 넣었는지 확인하십시오. Debuggex는 기본적으로 Unix 스타일 (\ n)입니다.

또한 NEL (\ u0085)은 완전히 다릅니다 : https://en.wikipedia.org/wiki/Newline#Unicode

(\r?\n)유닉스와 윈도우를 다룰 것입니다. (\r\n|\r|\n)구형 Mac 과도 일치 시키려면보다 복잡한 것이 필요합니다 .


debuggex에 대한 매우 흥미로운 점! 또한 \ u0085를 지적 해 주셔서 감사합니다.
KeyNone

3

PCRE에서 \R일치 \n, \r\r\n.


의심의 여지가 없습니다
Sandwell

1
@ Sandwell : 죄송합니다, 당신을 얻지 않습니다, 이것은 질문이 아닙니다, 그것은 대답보다 간단합니다(\r\n|\r|\n)
Toto

2

이것은 질문 1에만 적용됩니다.

Windows에서 실행되고 여러 줄 MFC 편집기 상자를 사용하는 앱이 있습니다.
편집기 상자에는 CRLF 줄 바꿈
이 필요하지만 실제로 큰 / 불쾌한 정규 표현식 으로 입력 한 텍스트를 구문 분석해야합니다 .

나는, 그래서 정규 표현식을 쓰는 동안 이것에 대해 강조 할 싶지 않았다
있도록 파서와 편집기 사이에 앞으로 내가 정상화 백업을 종료하고
정규식 등에서 특정 요소를 뽑아 오기 그냥 사용 \n. 또한 붙여 넣기 작업을 트랩하여 상자에 맞게 변환합니다.

시간이 많이 걸리지 않습니다.
이것이 내가 사용하는 것입니다.

 boost::regex  CRLFCRtoLF (
     " \\r\\n | \\r(?!\\n) "
     , MODx);

 boost::regex  CRLFCRtoCRLF (
     " \\r\\n?+ | \\n "
     , MODx);


 // Convert (All style) linebreaks to linefeeds 
 // ---------------------------------------
 void ReplaceCRLFCRtoLF( string& strSrc, string& strDest )
 {
    strDest  = boost::regex_replace ( strSrc, CRLFCRtoLF, "\\n" );
 }

 // Convert linefeeds to linebreaks (Windows) 
 // ---------------------------------------
 void ReplaceCRLFCRtoCRLF( string& strSrc, string& strDest )
 {
    strDest  = boost::regex_replace ( strSrc, CRLFCRtoCRLF, "\\r\\n" );
 }

2

파이썬에서 :

# as Peter van der Wal's answer
re.split(r'\r\n|\r|\n', text, flags=re.M) 

또는 더 엄격한 :

# https://docs.python.org/3/library/stdtypes.html#str.splitlines
str.splitlines()
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.