Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 正则表达式或者/或者不匹配所有内容_Java_Regex - Fatal编程技术网

Java 正则表达式或者/或者不匹配所有内容

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=

我试图解析一个HTTPGET请求,以确定url是否包含多种文件类型中的任何一种。如果有,我想捕获整个请求。关于奥林,我有点不明白

以下正则表达式仅捕获其中的一部分,并且仅当.flv是ORd值列表中的第一个int时

(我用空格模糊了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++;
  }
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)。*”。我得到两个组,一个包含整个字符串,另一个只包含扩展名。耶。它现在也在为我工作。我以前一定是摸过它。谢谢你的帮助!