Java регулярное выражение: сопоставление URL-адресов с пробелами и скобками - PullRequest
0 голосов
/ 09 мая 2020

С 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

Ответы [ 2 ]

1 голос
/ 09 мая 2020

Взгляните на этот код:

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 или более пробелов, это разделение между двумя именами файлов.

Надеюсь, это поможет.

0 голосов
/ 10 мая 2020

Ответ пользователя «Четвертая птица» решил эту проблему, регулярное выражение должно быть:

http.*?\.(?:pdf|jpe?g)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...