Я пытаюсь проанализировать HTTP-запрос GET, чтобы определить, содержит ли URL какой-либо из нескольких типов файлов. Если это произойдет, я хочу захватить весь запрос. Есть что-то, чего я не понимаю в ORing.
Следующее регулярное выражение захватывает только его часть, и только если .flv является первым int в списке значений ORd.
(я скрыл URL-адреса пробелами, потому что Stackoverflow ограничивает гиперссылки)
регулярное выражение:
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
Я не понимаю, почему. *? в конце регулярное выражение не успокаивает его, чтобы захватить весь текст. Если я избавлюсь от 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++;
}
}
} * * Тысяча двадцать-один