2010-04-27 2 views
0

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++; 
    } 

} }

답변

6

당신은 당신의 그룹이 잘못이있다. | 필요는 괄호 안에 있어야합니다 :

GET.*?(\.flv|\.mp4|\.avi).*? 

나는 또한 당신이 마지막 .*?의 끝에있는 ?을 왜 모르겠어요. 대부분의 언어에서? 여기서 *는 욕심이 많지 않으므로 일치하는 패턴을 방지하지 않으면 서 최대한 적은 수의 문자와 일치합니다. 이 경우에는 아무 문자와도 일치하지 않으므로 아무 것도 따르지 않으므로 그 최종을 제거하려고 할 것입니다. 모든

GET .*?(\.flv|\.mp4|\.avi).* 
+0

+1. regectant 한정 기호를 정규식의 마지막 항목으로 사용하는 것은 결코 의미가 없습니다. 이 경우 중요한 것은 아닙니다. 결함이있는 그룹화 덕분에 정규 표현식의 일부도 도달하지 못했습니다. –

+0

그럴 수도 있습니다. 어쨌든, 나는 그것을 시도하고 이제 myregextester 닷컴 또는 Java 코드에서 일치하는 항목을 얻지 못한다. – user327105

+0

흠, myregextester.com에서 원본 텍스트 "GET http : // foo.server.com/download/0/37/3000016511/.flv?mt=video/xy"와 공백을 둘 수 있습니다. // 제거) 및 regex "GET. *? (\ .flv | \ .mp4 | \ .avi). *". 나는 두 개의 그룹을 얻는다. 하나는 전체 문자열을 포함하고 다른 하나는 확장을 포함한다. –

0

첫째, 당신의 정규식은 다음과 같이 읽습니다

GET.*?(\.flv) | (\.mp4) | (\.avi).*? 

은 (공간 명확성을 위해 추가). 다음과 같이 시도하십시오.

GET.*?(\.flv|\.mp4|\.avi).*?