[regex] EOF와 일치하는 정규식

다음과 같은 데이터가 있습니다.

john, dave, chris
rick, sam, bob
joe, milt, paul

이름을 일치시키기 위해이 정규식을 사용하고 있습니다.

/(\w.+?)(\r\n|\n|,)/

이는 대부분의 작동하지만 파일의 끝이 갑자기 마지막 값을 의미하는 마지막 단어에서 끝나지 않는다 후 \r\n, \n또는 ,이 EOF로 끝납니다. 두 번째 그룹에 바로 넣을 수 있도록 정규식에서 EOF를 일치시키는 방법이 있습니까?



답변

이 질문에 대한 대답은 \Z그것을 알아내는 데 시간이 걸리지 만 지금은 작동합니다. 반대로, \A전체 문자열 의 시작 ^$일치합니다 (한 줄의 시작 과 반대로 일치 함).


답변

EOF는 실제로 문자가 아닙니다. 여러 줄의 문자열이있는 경우 ‘$’는 문자열의 끝과 줄의 끝과 일치합니다.

펄과 그 형제에서 \A\Z완전히 행 구분을 무시하고 문자열의 시작과 끝을 일치합니다.

POSIX의 정규 표현식에 사용하는 GNU 확장 \`\'같은 것들에 대한.


답변

Visual Studio에서 다음과 같이 EOF를 찾을 수 있습니다 $(?![\r\n]).. 이것은 줄 끝이 CR, CRLF 또는 LF인지 여부에 관계없이 작동합니다.

보너스로 모든 코드 파일에 다음과 같은 최종 줄 바꿈 마커가 있는지 확인할 수 있습니다.

               Find What: (?<![\r\n])$(?![\r\n])
            Replace With: \r\n
 Use Regular Expressions: checked
Look at these file types: *.cs, *.cshtml, *.js

작동 원리 :

앞에 CR 또는 LF가없고 뒤에 CR 또는 LF가없는 행 끝 (폭이 0 인 일치)을 찾으십시오. 이것이 작동하는 이유를 보여줄 생각이 있습니다!

CR, LF 또는 CRLF 등 원하는 줄 끝 문자로 교체해야합니다.


답변

Ryan이 제안한 \ Z의 동작을 \ z와 대조하십시오.

$ perl -we 'my $ corpus = "안녕하세요 \ n"; $ corpus = ~ s / \ Z / world / g; print ( ": $ corpus : \ n") '
: helloworld
세계:
$ perl -we 'my $ corpus = "안녕하세요 \ n"; $ corpus = ~ s / \ z / world / g; print ( ": $ corpus : \ n") '
:여보세요
세계:
$

Perlre sez :

\ Z 문자열의 끝 또는 끝의 개행 이전에만 일치
\ z 문자열의 끝에서만 일치

테스트 케이스를 Ruby (1.8.7, 1.9.2)로 변환하는 것은 동일하게 작동합니다.


답변

정말 줄 구분 기호를 캡처해야합니까? 그렇지 않은 경우이 정규식 만 있으면됩니다.

/\w+/

일치하려는 모든 하위 문자열이 예제와 같이 전적으로 단어 문자로 구성되어 있다고 가정합니다.


답변

(\ r \ n | \ n) 대신 $ (EOL / EOF)를 시도 하시겠습니까?

/\"(.+?)\".+?(\w.+?)$/


답변

최근에 나는 이와 같은 것을 찾고 있었지만 JavaScript를 찾고 있었다.

여기에두면 같은 문제가있는 사람은 누구나 혜택을받을 수 있습니다.

var matchEndOfInput = /$(?![\r\n])/gm;

기본적으로 이것은 캐리지 리턴이나 줄 바꾸기 문자가 뒤 따르지 않는 줄의 끝과 일치합니다. 본질적으로 이것은 \ZJavaScript 와 동일 합니다.