EOF와 일치하는 정규식


90

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

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

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

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

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


한 그룹의 모든 이름을 캡처하려고합니까 아니면 이름 당 하나의 캡처 그룹을 캡처하려고합니까?
Andrew Hare

정규식에 문제가있을 때해야 할 한 가지는 패턴의 요소를 분리하여 시도하는 것입니다. 마지막에 토큰이 걱정된다면 토큰없이 표현식을 테스트하세요.
akf

: 그냥 좋은 정규식 테스트 사이트 추가하고 싶었 regexplanet.com/simple
northpole


@Sinan-동의합니다. 합병
Marc Gravell

답변:


160

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


5
프로젝트 파일 검색 과 달리 프로젝트 파일 검색 을 위해 netbeans에서 그러한 fonctionality를 추구 하는 경우 다음과 같은 동작이 다르게 작동합니다 ... (\s*)\?>(\s*)\Z... 그리고 여기에서 좀 더 파고 들으면 프로젝트 폴더에서 작동하는 것이 있습니다. : (\s*)\?>(\s*)(\n*)(\W)\Z 참고 : 모든 닫는 PHP 태그를 파일 끝에서 줄 바꿈으로 대체합니다.
MediaVince

1
밝혀 \A도 찾기 및 바꾸기 Visual Studio에서 작동합니다. 항상 조심스럽게 그런 것들을 사용하지만, 일단 내가 행복 해지면 실제로 옳은 일을 할 것입니다.
Steve Pettifer

Scanner한 번에 전체 파일을 읽기 위해 Java의 클래스를 사용하는 동안 ; \Z구분자로 사용하면 후행 개행 문자가 잘립니다. 구분 기호를으로 변경하면 \z후행 개행 문자가 유지됩니다. Martin Dorey의 대답 은 Java에도 적용되는 것 같습니다 .
mmdemirbas

24

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

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

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


17

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 등 원하는 줄 끝 문자로 교체해야합니다.


Visual Studio 2019에는 모두 이것으로 교체하면 파일 끝에 두 개의 줄 바꿈이 추가 될 수있는 버그가 있습니다. 저장 옵션에 자동 삽입 줄 바꿈과 관련이 있다고 생각합니다.
Stevoisiak

9

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)로 변환하는 것은 동일하게 작동합니다.


2

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

/\w+/

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



2

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

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

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

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


1

문자열을 전체로 처리하기 위해 적절한 수식어 강제를 사용하고 있다고 가정하면 (줄 단위가 아니라 \ n 작동하는 경우 사용하고 있음) 다른 대안을 추가하십시오. 문자열 끝 : (\ r \ n | \ n |, | $)


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