gpt4 book ai didi

java - 正则表达式要么/要么不匹配所有内容

转载 作者:行者123 更新时间:2023-12-01 17:39:34 25 4
gpt4 key购买 nike

我正在尝试解析 HTTP GET 请求以确定该 url 是否包含多种文件类型中的任何一种。如果是这样,我想捕获整个请求。我对 ORing 有一些不明白的地方。

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

(我用空格遮盖了网址,因为 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

我不明白为什么是.*?正则表达式的末尾并没有让它捕获整个文本。如果我摆脱文件类型的“或”运算,那么它就可以工作。

这是测试代码,以防我的解释没有意义:

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

}}

最佳答案

您的分组错误。 | 需要位于括号内:

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

我也不确定为什么最后的 .*? 末尾有 ?。在大多数语言中,?这里使 * 非贪婪,因此它匹配尽可能少的字符,同时不阻止模式匹配。在这种情况下,这意味着它不匹配任何字符,因为它后面没有任何字符,所以您可能想要删除最后的 ?。

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

关于java - 正则表达式要么/要么不匹配所有内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2723765/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com