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

이 답변을 쓰는 동안 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)?


답변

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

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

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

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


답변

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 과도 일치 시키려면보다 복잡한 것이 필요합니다 .


답변

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


답변

이것은 질문 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" );
 }


답변

파이썬에서 :

# 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()


답변