So erhalten Sie mit Regex übereinstimmende Gruppenwerte

Lesezeit: 2 Minuten

Benutzer-Avatar
Bilal Mirza

Ich habe folgende Codezeilen

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");
}

Ich bekomme Stunden, Minuten, Sekunden und Millisekunden mit dem matcher.replace Methode und Rückverweise von Regex-Gruppen. Gibt es eine bessere Methode, um den Wert von Regex-Gruppen zu erhalten? Ich habe es versucht

hours = matcher.group(1);

aber es wirft die folgende Ausnahme:

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)

Übersehe ich hier etwas?

  • Nur um sicherzugehen, überprüfen Sie noch matcher.matches() == True erstes richtig?

    – Eser Aygün

    26. Juli 2012 um 9:36 Uhr

Benutzer-Avatar
Markus Byers

Es funktioniert gut, wenn Sie es vermeiden, anzurufen matcher.replaceAll. Wenn du anrufst replaceAll es vergisst alle vorherigen Übereinstimmungen.

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);
}

Beachten Sie, dass ich auch einige Verbesserungen an Ihrem regulären Ausdruck vorgenommen habe:

  • Ich habe nicht erfassende Gruppen verwendet (?: ... ) für die Gruppen, die Sie nicht erfassen möchten.
  • Ich habe mich verändert . die mit einem beliebigen Zeichen übereinstimmt \\. was nur einem Punkt entspricht.

Sehen Sie, wie es online funktioniert: Idee

  • Ich musste matcher.find() anstelle von matcher.matches() verwenden, als ich dies implementierte. Abgesehen davon hat das bei mir einwandfrei funktioniert.

    – Jeff M

    5. Februar 2021 um 16:29 Uhr

Es funktioniert, wenn Sie verwenden matcher.find() bevor die Gruppenfunktion aufgerufen wird.

  • Ich habe eine Situation, wo find gibt true zurück, aber groups löst eine Ausnahme aus

    – Dopatraman

    19. Juli 2017 um 20:39 Uhr

1054720cookie-checkSo erhalten Sie mit Regex übereinstimmende Gruppenwerte

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy