1

Хочу из текст достать две ссылки и вывести их. Не могу понять, почему у меня появляется еще лишний текст, ведь он не соответствует выражению

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

Mii
  • 351

1 Answers1

1

Попробуйте вот так:

https://(.+?)\\.(com|ru)

Дело в том, что при работе жадного квантификатора + строка рассматривается полностью. А потом конец регулярного выражения (у вас это \\.(com|ru)) ищется с конца. Таким образом он в первую очередь находит .ru, принадлежащий https://google.ru.

Используйте ленивый квантификатор +?, который в отличии от жадного будет стараться найти самое короткое совпадение, что вам и нужно.

Разница в работе квантифкатора на примере строки Анна Анатолий.

  1. С жадным квантификатором: А.+а сканирование начинается с начала строки (находит А у Анны), движется до самого конца (до й в Анатолий), а потом начинает двигаться обратно и находит вторую а в слове Анатолий. Таким образом результат будет Анна Ана.
  2. Со сверхжадным квантификатором: А.++а сканирование строки будет аналогично жадному режиму, только не будет осуществлено обратное сканирование от конца строки. Таким образом будет отсканирована вся строка Анна Анатолий, после чего её сравнят с шаблоном. Т.е. такой поиск ничего не вернёт, потому что Анна Анатолий не соответствует шаблону А.++а.
  3. С ленивым квантификатором: А.+?а поиск будет происходит с начала строки и до первого удовлетворяющего шаблон результата. То есть получится Анна. При повторном вызове метода find() будет возвращена строка Ана из слова Анатолий.
Zhenyria
  • 2,141
  • 2
  • 16
  • 47
  • Интересная специфика работы! Спасибо за ответ! – Mii Sep 06 '20 at 19:11