2013-02-20 5 views
1

나는 나의 예를 들어 정규식 내가하고 싶은 방식으로 작동하지 않는 이유를 이해하려고 노력 해요 :경계 사이에서 텍스트를 제외하는 방법은 무엇입니까?

test-text: Filename: test myFile 123 .txt 
pattern: (?<=Filename:.*?myFile)(.*?)(?=.txt) 
Expected Result: 123 

내가 아는 내다/뒤 여기에 적합하지 않습니다,하지만 그냥 이해하려고 목적을 학습합니다.

그럼 .*?myFile이 작동하지 않는 이유는 무엇입니까? 제거하면 패턴은 test myFile 123과 일치합니다. 하지만 Filename:을 찾아서 myFile까지 모든 것을 제외하고 모든 내용을 취한 후 마지막으로 .txt 문을 사용해야합니다. 내가 여기서 무엇을 놓치고 있니?

+1

regex flavor에 따라 가변 길이 lookbehind가 지원되지 않을 수 있습니다. – cmbuckley

답변

1

정규식 일치의 복잡성 때문에 가변 길이 lookbehind 패턴은 지원되지 않습니다. 그 결과에 대한 오류 메시지가 나타납니다. 이것은 Perl의 정규식 엔진의 한계에 불과합니다.

다소 비슷한 기능이 있습니다. \K은 최종 일치에서 왼쪽의 모든 항목을 삭제합니다.

/Filename:.*?myFile\K(.*?)(?=.txt)/ 

그것이 경기를 중복 허용하지 않는다는 점에서, 그러나, 진정한 lookbehind과 동일하지 않습니다 : 당신이 그것을에 예상대로 따라서이 패턴은 아마 작동합니다.

덧붙여서, 이것은 지금 당신이 올린 세 번째 유사한 질문입니다. 당신이 제공 한 정보에 기초 할 때, 정답은 여전히 ​​"이것에 둘러보기를 사용하지 마십시오"입니다. 사용하려는 이유가 있다면 더 나은 도움을 줄 수 있도록 설명해야합니다.

+0

대답은 정확하지만 앞뒤에 공백이 남습니다. 그것들을 포함시킬 수도 있습니다. 'Filename :. *? myFile \ s * \ K. *? (? = \ s * .txt)' – Achrome

+0

@AshwinMukhija, 맞습니다. 그러나 이것은 실제 정규 표현식 매칭 문제보다 더 기술적 인 질문입니다. –

+0

사실이지만 완전히 정확한 패턴을 포함하는 것이 여전히 유용합니다.:) – Achrome

1

Lookbehind 어설 션은 고정 길이이어야합니다. .*?myFile은 아닙니다.

이 사용하는 언어에 따라, 당신 수 :

"(?<=Filename:)(.*?myFile\s*)([^\s]*?)(?=\s*.txt)" 당신이 lookbehind 및 내다 사랑한다면 group(2)를 얻을. group(1)

+0

가변 길이 lookbehind는 Perl 6 및 .NET에서 허용됩니다. – Toto

0

또는

"Filename:.*?myFile\s*([^\s]*)\s*\.txt" 얻을 왜 그렇게 복잡해?

/myFile(.*?)\.txt$/ 

관심있는 모든 것이 있다면 그룹을 캡처하십시오. 주위를 둘러 볼 필요가 없습니다. IMO.

편집 : 당신의 잘못 : 아마 당신의 정규식 엔진이 가변 길이 둘러보기를 지원하지 않습니다.

+0

그럴 수도 있지만 그 질문은 그의 정규 표현식에 특히 잘못된 점에 관한 것입니다. Lookahead에서 비 탐욕적 운영자가 작동하지 않는 이유는 무엇입니까? –

+0

(? : 파일 이름 :. *? myFile) (. *?) (? : .txt) 비 캡처 그룹? : not? = – Matheus

관련 문제