使用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)