Взгляните на этот код:
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
Объяснение:
Я предполагаю, что в имени файла нет двух последовательных пробелов, как показано в примерах.
(https?)://
идентифицирует подстроки http://
или https://
.
У нас есть два групп на этом участке: (([\\S]+)(\\s)?
. Он идентифицирует 1 или несколько символов (кроме пробелов), за которыми следуют только 1 или 0 символов пробела.
С символом *
этот процесс может повторяться несколько раз.
Следовательно, наше выражение понимает, что если есть 2 или более пробелов, это разделение между двумя именами файлов.
Надеюсь, это поможет.