Shlop
@Shlop
Full Stack Developer (PHP/Laravel/JavaScript)

Почему группа регулярного выражения срабатывает именно так?

Здравствуйте, есть следующий код:
String str = "Какой то текст 199 и опять какой то текст ?";
String pattern = "(.*)(\\d+)";
Pattern r = Pattern.compile(pattern);
Matcher m = r.matcher(str);
   if(m.find( )) {
       System.out.println(m.group(1));
       System.out.println(m.group(2));
   } else {
        System.out.println("НЕ СОВПАДАЕТ");
    }

Вывод такой:
Какой то текст 19
9

И вот не понимаю а почему первая группа регулярного выражения "(.*)" заканчивается на "Какой то текст 19" почему вот именно тут ? Я просто сейчас думаю что первая группа должна совпасть со всей строкой целиком. Подскажите пожалуйста почему регулярка работает именно так, заранее благодарю за ответ.
  • Вопрос задан
  • 96 просмотров
Решения вопроса 2
@agmt
Читать про "lazy/greedy". "*" является жадным и старается забрать как можно больше символов, но удовлетворение всего выражение является более важным. Иное поведение будет у "(.*?)(\\d+)"
Ответ написан
Комментировать
@AUser0
Чем больше знаю, тем лучше понимаю, как мало знаю.
Потому что regexp по умолчанию - greedy. Используйте: (.*?)(\\d+)
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
@KingstonKMS
.* - любой символ, в том числе и цифра.
\\d+ - один и более символов.
Именно по этому так делает: (Какой то текст 19)(9) и опять какой то текст ?
Ответ написан
fzfx
@fzfx
18,5 дм
> Я просто сейчас думаю что первая группа должна совпасть со всей строкой целиком.
в таком случае ничего не остаётся для второй группы.
уберите вторую группу из регулярного выражения и будет вам совпадение со всей строкой целиком.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы