Подтвердить что ты не робот

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

У меня есть следующие строки кода

String time = "14:35:59.99";
String timeRegex = "(([01][0-9])|(2[0-3])):([0-5][0-9]):([0-5][0-9])(.([0-9]{1,3}))?";
String hours, minutes, seconds, milliSeconds;
Pattern pattern = Pattern.compile(timeRegex);
Matcher matcher = pattern.matcher(time);
if (matcher.matches()) {
    hours = matcher.replaceAll("$1");
    minutes = matcher.replaceAll("$4");
    seconds = matcher.replaceAll("$5");
    milliSeconds = matcher.replaceAll("$7");
}

Я получаю часы, минуты, секунды и миллисекунды, используя метод matcher.replace и обратные ссылки групп regex. Есть ли лучший способ получить значение регулярных выражений. Я попробовал

hours = matcher.group(1);

но это вызывает следующее исключение:

java.lang.IllegalStateException: No match found
    at java.util.regex.Matcher.group(Matcher.java:477)
    at com.abnamro.cil.test.TimeRegex.main(TimeRegex.java:70)

Я что-то пропустил?

4b9b3361

Ответ 1

Он отлично работает, если вы не вызываете matcher.replaceAll. Когда вы вызываете replaceAll, он забывает о любых предыдущих совпадениях.

String time = "14:35:59.99";
String timeRegex = "([01][0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9])(?:\\.([0-9]{1,3}))?";
Pattern pattern = Pattern.compile(timeRegex);
Matcher matcher = pattern.matcher(time);
if (matcher.matches()) {
    String hours = matcher.group(1);
    String minutes = matcher.group(2);
    String seconds = matcher.group(3);
    String miliSeconds = matcher.group(4);
    System.out.println(hours + ", " + minutes  + ", " + seconds + ", " + miliSeconds);
}

Заметьте, что я также сделал несколько улучшений для вашего регулярного выражения:

  • Я использовал группы, не захватывающие группу (?: ... ) для групп, которые вас не интересуют.
  • Я изменил ., который соответствует любому символу \\., который соответствует только точке.

Посмотрите, как он работает в Интернете: ideone

Ответ 2

Он работает, если вы используете matcher.find() перед вызовом групповой функции.