Java正则表达式:用空格和方括号匹配URL



使用Java Regex,我无法匹配带有空格、(和(括号的URL,下面是一个代码示例,您能帮忙吗。只有最后一个URL的E.jpeg有效。

代码

public static void main(String[] args) {
String content = "Lorem ipsum https://example.com/A B 123 4.pdf   https://example.com/(C.jpeg   https://example.com/D).jpeg   https://example.com/E.jpeg";
extractUrls(content);
}
public static void extractUrls(String text) {
Pattern pat = Pattern.compile("(https?)://[-a-zA-Z0-9+&@#/%?=~_|!:,.;]*[-a-zA-Z0-9+&@#/%=~_|]", Pattern.CASE_INSENSITIVE);
Matcher matcher = pat.matcher(text);
while (matcher.find()) {
System.out.println(matcher.group());
}
}

输出

https://example.com/A
https://example.com/
https://example.com/D
https://example.com/E.jpeg

预期输出:

https://example.com/A B 123 4.pdf
https://example.com/(C.jpeg
https://example.com/D).jpeg
https://example.com/E.jpeg

看看这个代码:

import java.lang.Math; 
import java.util.regex.Pattern;
import java.util.regex.Matcher;
public class MyClass {
public static void main(String[] args) {
String content = "Lorem ipsum https://example.com/A B 123 4.pdf   https://example.com/(C.jpeg   https://example.com/D).jpeg   https://example.com/E.jpeg";
extractUrls(content);
}
public static void extractUrls(String text) {
Pattern pat = Pattern.compile("(https?)://(([\S]+)(\s)?)*", Pattern.CASE_INSENSITIVE);
Matcher matcher = pat.matcher(text);
while (matcher.find()) {
System.out.println(matcher.group());
}
}
}

输出:

https://example.com/A B 123 4.pdf 
https://example.com/(C.jpeg 
https://example.com/D).jpeg 
https://example.com/E.jpeg

解释:

我假设文件名没有两个连续的空格,如示例所示。

CCD_ 2标识子串CCD_ 3或CCD_。

我们在这篇文章中有两组:(([\S]+)(\s)?。它标识1个或多个字符(空白字符除外(,后面只有1或0个空白字符。

对于字符*,此过程可以重复多次。

因此,我们的表达式理解为,如果有2个或多个空格,则表示两个文件名之间的分隔。

我希望它能有所帮助。

"第四只鸟"用户的回答解决了这个问题,正则表达式应该是:

http.*?.(?:pdf|jpe?g)

最新更新