如何获得正则表达式匹配的组值

Bil*_*rza 44 java regex

我有以下几行代码

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");
}
Run Code Online (Sandbox Code Playgroud)

我使用matcher.replace正则表达式组的方法和反向引用获得小时,分钟,秒和毫秒.有没有更好的方法来获得正则表达式组的价值.我试过了

hours = matcher.group(1);
Run Code Online (Sandbox Code Playgroud)

但它抛出以下异常:

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)
Run Code Online (Sandbox Code Playgroud)

我在这里错过了什么吗?

Mar*_*ers 70

如果你避免打电话,它工作正常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);
}
Run Code Online (Sandbox Code Playgroud)

请注意,我还对正则表达式进行了一些改进:

  • 我已经将非捕获组(?: ... )用于您不想捕获的组.
  • 我已经更改.了匹配任何\\.只匹配一个点的字符.

看到它在线工作:ideone


cos*_*tru 10

如果matcher.find()在调用组函数之前使用它,它可以工作.

  • 我有一种情况,`find` 返回 true 但组抛出异常 (2认同)