2009-07-23 4 views
59

EOF와 일치하는 정규식

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

대부분의 경우 작동하지만 마지막 단어가 끝나면 파일이 갑자기 종료됩니다. 마지막 값은 \r\n, \n 또는 ,에서 끝나지 않으며 EOF로 끝납니다. regex에 EOF를 매치 할 수있는 방법이 있나요? 두 번째 그룹핑에 바로 넣을 수 있습니까?

+0

이름마다 하나의 그룹 또는 하나의 캡처 그룹에있는 모든 이름을 캡처하려고합니까? –

+4

어떤 플랫폼입니까? –

+0

정규식에 문제가있을 때 한 가지해야 할 일은 당신의 요소를 고립 시켜서 시험해 보는 것입니다. 마지막에 토큰이 염려되는 경우에는 토큰없이 토큰을 테스트하십시오. – akf

답변

117

\Z이 질문에 대한 대답은 알아 내기 위해 잠시 시간이 걸렸지 만 지금은 효과가 있습니다. 반대로 \A은 전체 문자열의 시작과 일치합니다 (^$은 한 줄의 시작과 일치 함).

+3

파일 검색에서 **와는 달리 ** 프로젝트 파일 검색 **에 대해 netbeans와 같은 기능을 수행하면 머리가 위로 올라갑니다. 다음은 다르게 작동합니다 ... '(\ s *) \ (\ s *) \?> (\ n *) (\ W (\ s *) \?)) \ Z' 참고 : 이것은 파일 끝에서 줄 바꿈으로 모든 닫는 PHP 태그를 바꾸는 것입니다. – MediaVince

+1

'\ A'는 Visual Studio에서 찾기 및 바꾸기 기능을합니다. 항상 그런 것들을 신중하게 사용 하듯이 실제로는 올바른 일을하게되면 기뻤다. –

+0

Java의'Scanner' 클래스를 사용하여 한 번에 전체 파일을 읽는 동안, '\ Z'를 구분 기호로 사용하면 줄 바꿈 문자가 잘립니다. 구분 기호를'\ z'로 바꿨을 때, 줄 바꿈 문자가 보존되었습니다. [Martin Dorey의 답변] (https://stackoverflow.com/a/13651321/471214)은 Java에도 적용됩니다. – mmdemirbas

1

문자열을 전체적으로 처리하기 위해 수정 기호를 사용한다고 가정하면 (줄 단위가 아니고 \ n이 사용할 수 있고 사용중인 경우) 문자열의 끝을 추가하면됩니다. (\ 연구 \ 없음 | \ n |, | $)

0

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

+2

아마도'\ w +'을 의미했을 것입니다, 그렇습니까? 아마 – Abel

+4

. 더 이상 기억이 안 나네 :-) – cube

17

EOF 실제로 문자가 아닙니다. 여러 줄짜리 문자열을 가지고 있다면 '$'는 문자열의 끝과 줄의 끝을 일치시킵니다.

Perl 및 그 형제에서 \A\Z은 줄 바꿈을 완전히 무시하고 문자열의 시작과 끝과 일치합니다.

POSIX regexes에 대한 GNU 확장은 동일한 내용에 \`\'을 사용합니다.

2

정말 선 구분 기호를 캡처해야합니까? 되지 않은 경우,이 정규식은 당신이 필요로하는 모든해야한다 : 당신이 일치 할 모든 문자열을 가정 것

/\w+/ 

당신의 예에서와 같이, 단어 문자의 전체 구성되어 있습니다.

2

아마도 \ (\ r \ n | \ n) 대신 $ (EOL/EOF)를 사용해 보시겠습니까?

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

콘트라스트 \ z를 라이언 제안 \의 Z의 동작 :

 
$ perl -we 'my $corpus = "hello\n"; $corpus =~ s/\Z/world/g; print(":$corpus:\n")' 
:helloworld 
world: 
$ perl -we 'my $corpus = "hello\n"; $corpus =~ s/\z/world/g; print(":$corpus:\n")' 
:hello 
world: 
$ 

perlre는 SEZ :

 
\Z Match only at end of string, or before newline at the end 
\z Match only at end of string 

루비 (1.8.7, 1.9로 테스트 케이스의 번역 .2)는 동일하게 행동합니다.

7

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가 뒤 따르지 않습니다. 어떤 생각은 이것이 왜 효과가 있는지 보여줍니다!

원하는 줄 끝 문자 (CR, LF 또는 CRLF)로 바꾸어야합니다.

+0

환상적! 감사 – MikeMurko

0

최근에 나는 JavaScript와 같은 것을 찾고있었습니다. 동일한 문제를 가진 사람이

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

는 기본적으로이 캐리지 리턴 또는 새 줄 문자로 따르지 라인의 끝과 일치 할 혜택을 누릴 수 있도록

것은, 여기 퍼팅. 본질적으로 이것은 \Z과 동일하지만 JavaScript의 경우입니다.

관련 문제