2013-10-28 2 views
0

자바에서 .jsp/.jspx 확장자가없는 문자열을 검색하려고하는데 부정적인 선견문 패턴으로는 많은 어려움을 겪고 있습니다. 문자열의 무리 감안할 때음수 Lookahead 정규 표현식을 올바르게 일치시키지 못함

:

String string1 = "templateName"; 
String string2 = "some/path" 
String string3 = "basic/filename/no/extension" 
String string4 = "some/path/to/file.jsp" 
String string5 = "alternative/path/to/file.jspx" 

내가 처음 3과 일치하는 정규식을 찾을려고하지 나는 부정적 예측과 정규식을 생각 했을까 지난 2

작동 할 것이다.

예는 :

Pattern p = new Pattern.compile("(.+)(?!\\.jsp[x]?)") 

하지만 그 패턴은 위의 모든 문자열과 일치하는 것 같다. 나는 처음에 그룹 1이 너무 욕심을 느꼈으므로 (. +?) 시도했지만 너무 도움이되지는 않는다고 생각했습니다.

SO Post은 부정적 예측을 설명하는 매우 훌륭한 역할을하지만 불행히도 올바른 조합을 찾지 못하는 것입니다.

나는 분명한 뭔가를 놓치고 있습니까?

+0

귀하의 패턴은 말한다 : NG, 당신은 문자열 $

참조의 말 뒤에 찾고있는 더 .jsp로 또는 .jspx

없다 .jsp 또는 .jspx가 바로 뒤 따르지 않는 _any_ 비어 있지 않은 문자 시퀀스를 찾으면 일치합니다. " 그래서'/ path/to/file.jsp'와 일치 할 것입니다.'s','so' 또는 마지막 슬래시를 포함하지 않는 한 무엇이든 일치 할 수 있기 때문입니다. anubhava의 대답을보십시오. 두번째는'.jsp [x]'가 문자열의 끝에 오는 경우 문자열의 시작 뒤에'.jsp [x]'가 오는 비어 있지 않은 문자 시퀀스가 ​​뒤따라 올 경우 부정적인 lookahead를 사용합니다.). – ajb

답변

2

당신은 같은 negative lookbehind 사용할 수 있습니다

Pattern p = new Pattern.compile("^(.+)(?<!\\.jspx?)$"); 

을 또는 당신이로 negative lookahead를 사용할 수 있습니다

Pattern p = new Pattern.compile("^(?!.+?\\.jspx?$)(.+)$"); 
+0

답변 해 주셔서 감사합니다. 불행히도, 나는 두 패턴이 어떻게 작동하는지 이해하지 못합니다. 패턴이 어떻게 일치하는지 조금 설명해 줄 수 있습니까? Lookahead 또는 Lookbehind Exoressions의 구성을 제대로 파악할 수 없었습니다. –

+0

@EricB : 둘러보기에 대한 가장 좋은 설명은 다음 간단한 문서를 참조하십시오. http://www.regular-expressions.info/lookaround.html – anubhava

+0

내 대답에 만족하면 "수락"으로 표시하십시오. 앞으로 비슷한 문제가있는 사용자는 쉽게 볼 수 있습니다. – anubhava

관련 문제