Java 正则表达式或者/或者不匹配所有内容
我试图解析一个HTTPGET请求,以确定url是否包含多种文件类型中的任何一种。如果有,我想捕获整个请求。关于奥林,我有点不明白 以下正则表达式仅捕获其中的一部分,并且仅当.flv是ORd值列表中的第一个int时 (我用空格模糊了URL,因为Stackoverflow限制了超链接) 正则表达式:Java 正则表达式或者/或者不匹配所有内容,java,regex,Java,Regex,我试图解析一个HTTPGET请求,以确定url是否包含多种文件类型中的任何一种。如果有,我想捕获整个请求。关于奥林,我有点不明白 以下正则表达式仅捕获其中的一部分,并且仅当.flv是ORd值列表中的第一个int时 (我用空格模糊了URL,因为Stackoverflow限制了超链接) 正则表达式: GET.*?(\.flv)|(\.mp4)|(\.avi).*? 测试文本: GET http: // foo.server.com/download/0/37/3000016511/.flv?mt=
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++;
}
publicstaticvoidmain(字符串[]args){
//TODO自动生成的方法存根
String sourcestring=“GET http://foo.server.com/download/0/37/3000016511/.flv?mt=video/xy”;
Pattern re=Pattern.compile(“GET.*?\\\.flv.*”);//这很有效
//输出:
//[0][0]=获取http://foo.server.com/download/0/37/3000016511/.flv?mt=video/xy
//下面的匹配以“.flv”结束,而不是整个url。
//此外,只有当.flv是3个ORd选项中的第一个选项时,它才起作用
//Pattern re=Pattern.compile(“GET.*?(\\.flv)|(\\.mp4)|(\\.avi)。*?”;
//输出:
//[0][0]=获取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()){
对于(int-groupIdx=0;groupIdx
}
}您的分组错误。
|
需要在括号内:
GET.*?(\.flv|\.mp4|\.avi).*?
我也不知道你为什么在最后的*?
结尾有?
。在大多数语言中?这里使*非贪婪,因此它匹配尽可能少的字符,同时不阻止模式匹配。在本例中,这意味着它不匹配任何字符,因为它后面没有任何字符,所以您可能希望删除该final
GET .*?(\.flv|\.mp4|\.avi).*
你分组错了。
|
需要在括号内:
GET.*?(\.flv|\.mp4|\.avi).*?
我也不知道你为什么在最后的*?
结尾有?
。在大多数语言中?这里使*非贪婪,因此它匹配尽可能少的字符,同时不阻止模式匹配。在本例中,这意味着它不匹配任何字符,因为它后面没有任何字符,所以您可能希望删除该final
GET .*?(\.flv|\.mp4|\.avi).*
首先,您的正则表达式如下所示:
GET.*?(\.flv) | (\.mp4) | (\.avi).*?
GET.*?(\.flv|\.mp4|\.avi).*?
(为清晰起见,添加了空格)。试着这样做:
GET.*?(\.flv) | (\.mp4) | (\.avi).*?
GET.*?(\.flv|\.mp4|\.avi).*?
首先,您的正则表达式如下所示:
GET.*?(\.flv) | (\.mp4) | (\.avi).*?
GET.*?(\.flv|\.mp4|\.avi).*?
(为清晰起见,添加了空格)。试着这样做:
GET.*?(\.flv) | (\.mp4) | (\.avi).*?
GET.*?(\.flv|\.mp4|\.avi).*?
+1.将不情愿的量词作为正则表达式中的最后一件事是没有意义的。在这种情况下,这并不重要;多亏了错误的分组,正则表达式的这一部分甚至从未被使用过。有可能我是从这一部分开始的。无论如何,我试过了,但现在没有找到匹配项,无论是在myregextester.com还是在java代码中。嗯,它在myregextester.com上对我有效,源文本是“get http://foo.server.com/download/0/37/300006511/.flv?mt=video/xy”(在//removed周围有空格)和regex“get.*”(\.flv.\.mp4.\.avi)。*”。我得到两个组,一个包含整个字符串,另一个只包含扩展名。耶。它现在也在为我工作。我以前一定是摸过它。谢谢你的帮助+1.将不情愿的量词作为正则表达式中的最后一件事是没有意义的。在这种情况下,这并不重要;多亏了错误的分组,正则表达式的这一部分甚至从未被使用过。有可能我是从这一部分开始的。无论如何,我试过了,但现在没有找到匹配项,无论是在myregextester.com还是在java代码中。嗯,它在myregextester.com上对我有效,源文本是“get http://foo.server.com/download/0/37/300006511/.flv?mt=video/xy”(在//removed周围有空格)和regex“get.*”(\.flv.\.mp4.\.avi)。*”。我得到两个组,一个包含整个字符串,另一个只包含扩展名。耶。它现在也在为我工作。我以前一定是摸过它。谢谢你的帮助!