Проблемы c Matcher java
Хочу из текст достать две ссылки и вывести их. Не могу понять, почему у меня появляется еще лишний текст, ведь он не соответствует выражению
String text = "Hello! This is Jake from https://microsoft.com. " +
"Follow this link https://google.ru to find some information";
Pattern pattern = Pattern.compile("https://(.+)\\.(com|ru)");
Matcher matcher = pattern.matcher(text);
//Пока есть совпадения с шаблоном
while (matcher.find()){
System.out.println(matcher.group()); //выводим то, что нашел Matcher
}
Заместо просто ссылок выводит следующее: https://microsoft.com. Follow this link https://google.ru
Ответы (1 шт):
Попробуйте вот так:
https://(.+?)\\.(com|ru)
Дело в том, что при работе жадного квантификатора + строка рассматривается полностью. А потом конец регулярного выражения (у вас это \\.(com|ru)) ищется с конца. Таким образом он в первую очередь находит .ru, принадлежащий https://google.ru.
Используйте ленивый квантификатор +?, который в отличии от жадного будет стараться найти самое короткое совпадение, что вам и нужно.
Разница в работе квантифкатора на примере строки Анна Анатолий.
- С жадным квантификатором:
А.+асканирование начинается с начала строки (находит А у Анны), движется до самого конца (до й в Анатолий), а потом начинает двигаться обратно и находит вторую а в слове Анатолий. Таким образом результат будет Анна Ана. - Со сверхжадным квантификатором:
А.++асканирование строки будет аналогично жадному режиму, только не будет осуществлено обратное сканирование от конца строки. Таким образом будет отсканирована вся строка Анна Анатолий, после чего её сравнят с шаблоном. Т.е. такой поиск ничего не вернёт, потому что Анна Анатолий не соответствует шаблонуА.++а. - С ленивым квантификатором:
А.+?апоиск будет происходит с начала строки и до первого удовлетворяющего шаблон результата. То есть получится Анна. При повторном вызове метода find() будет возвращена строка Ана из слова Анатолий.