Как извлечь URL изображения из строки?

Я пытаюсь извлечь URL-адрес изображения из строки. Я использую Pattern и Matcher. Я использую регулярное выражение для соответствия тому же самому. Всякий раз, когда я пытаюсь отладить код, как matcher.matches(), так и matcher.find() приводят к ложным результатам. Я прилагаю URL-адрес изображения и регулярное выражение, а также свой код.

Pattern pattern_name;
Matcher matcher_name;

String regex = "(http(s?):/)(/[^/]+)+\" + \"\\.(?:jpg|gif|png)";
String url = "http://www.medivision360.com/pharma/pages/articleImg/thumbnail/thumb3756d839adc5da3.jpg";

pattern_name = Pattern.compile(regex);
matcher_name = pattern_name.matcher(url);

matcher_name.matches();
matcher_name.find();

person Vinay Kelkar    schedule 01.04.2016    source источник
comment
Вы включили файлы библиотеки?   -  person    schedule 01.04.2016
comment
извините.. но какие файлы библиотеки? Я не понял тебя?   -  person Vinay Kelkar    schedule 01.04.2016
comment
Боюсь, у вас опечатка. Вам нужно (http(s?):/)(/[^/]+)+\\.(?:jpg|gif|png) или даже https?:/(/[^/]+)+\\.(?:jpg|gif|png). См. демонстрацию   -  person Wiktor Stribiżew    schedule 01.04.2016
comment
хорошо Виктор! Позволь мне проверить :)   -  person Vinay Kelkar    schedule 01.04.2016
comment
что +\" + \" выглядит неправильно   -  person njzk2    schedule 01.04.2016
comment
См. демонстрацию Java. Обратите внимание, что matches требует полного совпадения строки, а find найдет частичное совпадение, совпадение внутри большей строки.   -  person Wiktor Stribiżew    schedule 01.04.2016
comment
@VinayKelkar: Шаблон и класс сопоставления   -  person    schedule 01.04.2016


Ответы (3)


Кажется, у вас есть проблемы с регулярным выражением, \" + \" должно исходить из какого-то кода, который вы приняли за регулярное выражение. Для этого подшаблона требуется кавычка, один или несколько пробелов, затем пробел и еще одна двойная кавычка прямо перед расширением. Он соответствует чему-то вроде http://www.medivision360.com/pharma/pages/articleImg/thumbnail/thumb3756d839adc5da3" ".jpg.

Так же в начале есть две резервные группы захвата, их использовать не нужно.

Использовать

String regex = "https?:/(?:/[^/]+)+\\.(?:jpg|gif|png)";

См. эту демонстрацию.

демонстрация Java:

String rx = "https?:/(?:/[^/]+)+\\.(?:jpg|gif|png)";
String url = "http://www.medivision360.com/pharma/pages/articleImg/thumbnail/thumb3756d839adc5da3.jpg";
Pattern pat = Pattern.compile(rx);
Matcher matcher = pat.matcher(url);
if (matcher.matches()) {
    System.out.println(matcher.group());
}

Обратите внимание, что Matcher#matches() требует полного совпадения строки, а Matcher#find() найдет частичное совпадение, совпадение внутри большей строки.

person Wiktor Stribiżew    schedule 01.04.2016

Вы избежали двойных кавычек в катетерации строк
, поэтому механизм регулярных выражений увидит это (http(s?):/)(/[^/]+)+" + "\.(?:jpg|gif|png)
после того, как С++ проанализирует строку.

Вы можете отменить экранирование "(http(s?):/)(/[^/]+)+" + "\\.(?:jpg|gif|png)"
или просто соединить их вместе "(http(s?):/)(/[^/]+)+\\.(?:jpg|gif|png)"

person Community    schedule 01.04.2016

Если выражение всегда в конце, я бы предложил:

([^/?]+)(?=/?(?:$|\?))
person KevinO    schedule 01.04.2016
comment
если выражение всегда в конце...? Я не понял тебя, приятель? простите...? - person Vinay Kelkar; 02.04.2016
comment
@VinayKelkar, прошу прощения за то, что не выразился яснее. Если извлекаемый текст всегда находится в конце строки (как в вашем примере, который заканчивается на `/thumb3756d839adc5da3.jpg'), то это регулярное выражение извлечет его. Поэтому, если URL-адрес всегда заканчивается именем файла, это регулярное выражение будет извлекать его без попытки ограничения конкретным расширением. - person KevinO; 02.04.2016