Ваш шаблон .*weather.*([0-9]+).*
захватывает всю строку с первым .*
и возвращает назад, чтобы найти weather
, и, если он находит его, он захватывает часть строки после слов до конца строки с последующим .*
образец и возврат назад, чтобы найти последнюю цифру, и единственная цифра сохраняется в группе захвата 1, так как одна цифра удовлетворяет шаблону [0-9]+
. Последний .*
просто потребляет строку до конца.
Вы можете решить проблему, просто используя ".*weather.*?([0-9]+).*"
(делая второй .*
ленивым), но поскольку вы используете Matcher#find()
, вы можете использовать более простое регулярное выражение:
Pattern pattern = Pattern.compile("weather\\D*(\\d+)");
И после получения совпадения получить значение с помощью matcher.group(1)
.
См. regex demo .
Детали шаблона
weather
- weather
слово
\\D*
- 0+ символов, кроме цифр
(\\d+)
- Группа захвата 1: одна или несколько цифр
См. Демонстрационную версию Java :
String inputLine = "What is the weather in 75042?";
Pattern pattern = Pattern.compile("weather\\D*(\\d+)");
Matcher matcher = pattern.matcher(inputLine);
if (matcher.find()) {
System.out.println(matcher.group(1)); // => 75042
}