HTTP GET 요청을 구문 분석하여 URL에 여러 파일 유형 중 하나가 포함되어 있는지 확인하려고합니다. 그렇다면 전체 요청을 캡처하고 싶습니다. ORing에 대해 이해할 수없는 것이 있습니다.모든 것이 일치하거나 일치하지 않는 정규 표현식
다음 정규식은 .flv가 ORd 값 목록의 첫 번째 int 인 경우에만 그 일부만 캡처합니다.
는 (유래는 하이퍼 링크를 제한 때문에 공백으로 URL을 가려했습니다)
정규식 :
GET.*?(\.flv)|(\.mp4)|(\.avi).*?
테스트 텍스트 :
GET http: // foo.server.com/download/0/37/3000016511/.flv?mt=video/xy
일치 출력 :
GET http: // foo.server.com/download/0/37/3000016511/.flv
I d 그 이유를 이해하지 못해. *? regex의 끝에서 전체 텍스트를 캡처하기 위해 호출하지 않습니다. 파일 형식의 ORing을 제거하면 작동합니다. 여기
내 설명이 이해가되지 않는 경우 테스트 코드입니다 :public static void main(String[] args) {
// TODO Auto-generated method stub
String sourcestring = "GET http: // foo.server.com/download/0/37/3000016511/.flv?mt=video/xy";
Pattern re = Pattern.compile("GET .*?\\.flv.*"); // this works
//output:
// [0][0] = GET http :// foo.server.com/download/0/37/3000016511/.flv?mt=video/xy
// the match from the following ends with the ".flv", not the entire url.
// also it only works if .flv is the first of the 3 ORd options
//Pattern re = Pattern.compile("GET .*?(\\.flv)|(\\.mp4)|(\\.avi).*?");
// output:
//[0][0] = GET http: // foo.server.com/download/0/37/3000016511/.flv
// [0][1] = .flv
// [0][2] = null
// [0][3] = null
Matcher m = re.matcher(sourcestring);
int mIdx = 0;
while (m.find()){
for(int groupIdx = 0; groupIdx < m.groupCount()+1; groupIdx++){
System.out.println("[" + mIdx + "][" + groupIdx + "] = " + m.group(groupIdx));
}
mIdx++;
}
} }
+1. regectant 한정 기호를 정규식의 마지막 항목으로 사용하는 것은 결코 의미가 없습니다. 이 경우 중요한 것은 아닙니다. 결함이있는 그룹화 덕분에 정규 표현식의 일부도 도달하지 못했습니다. –
그럴 수도 있습니다. 어쨌든, 나는 그것을 시도하고 이제 myregextester 닷컴 또는 Java 코드에서 일치하는 항목을 얻지 못한다. – user327105
흠, myregextester.com에서 원본 텍스트 "GET http : // foo.server.com/download/0/37/3000016511/.flv?mt=video/xy"와 공백을 둘 수 있습니다. // 제거) 및 regex "GET. *? (\ .flv | \ .mp4 | \ .avi). *". 나는 두 개의 그룹을 얻는다. 하나는 전체 문자열을 포함하고 다른 하나는 확장을 포함한다. –