2016-04-01 3 views
1

Я пытаюсь извлечь URL-адрес изображения изнутри строки. Я использую Pattern и Matcher. Я использую регулярное выражение, чтобы оно совпало. Всякий раз, когда я пытаюсь отлаживать код, оба, matcher.matches() и matcher.find() приводят к false. У меня есть URL-адрес изображения и регулярное выражение, а также мой код.Как извлечь 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(); 
+0

Вы включили файлы библиотеки? –

+0

извините .. но какие файлы библиотеки? Я тебя не понял? –

+0

Боюсь, у вас есть опечатка. Вам нужно '(http (s?): /) (/ [^ /] +) + \\. (?: jpg | gif | png)' или даже 'https?:/(/ [^ /] +) + \\. (?: JPG | GIF | PNG) '. См. [Demo] (https://regex101.com/r/bN7cQ2/1) –

ответ

0

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

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

Использование

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

См this demo

Java demo:

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() найти частичное совпадение, совпадение внутри большей строки ,

0

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

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

0

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

([^/?]+)(?=/?(?:$|\?)) 
+0

если выражение всегда в конце ...? Я не получил тебя помощником? Прости...? –

+0

@VinayKelkar, я прошу прощения за то, что не яснее. Если текст, который нужно извлечь, всегда находится в конце строки (как в вашем примере, заканчивающемся '/thumb3756d839adc5da3.jpg '), тогда это регулярное выражение будет извлекать его. Поэтому, если URL-адрес всегда заканчивается именем файла, это регулярное выражение вытащит его без попытки ограничить конкретным расширением. – KevinO

Смежные вопросы