“Keine Übereinstimmung gefunden” bei Verwendung der Gruppenmethode des Matchers

Lesezeit: 2 Minuten

Keine Ubereinstimmung gefunden bei Verwendung der Gruppenmethode des Matchers
Amir Rachum

Ich benutze Pattern/Matcher um den Antwortcode in einer HTTP-Antwort abzurufen. groupCount gibt 1 zurück, aber ich erhalte eine Ausnahme, wenn ich versuche, sie abzurufen! Irgendeine Idee warum?

Hier ist der Code:

//get response code
String firstHeader = reader.readLine();
Pattern responseCodePattern = Pattern.compile("^HTTP/1\.1 (\d+) OK$");
System.out.println(firstHeader);
System.out.println(responseCodePattern.matcher(firstHeader).matches());
System.out.println(responseCodePattern.matcher(firstHeader).groupCount());
System.out.println(responseCodePattern.matcher(firstHeader).group(0));
System.out.println(responseCodePattern.matcher(firstHeader).group(1));
responseCode = Integer.parseInt(responseCodePattern.matcher(firstHeader).group(1));

Und hier ist die Ausgabe:

HTTP/1.1 200 OK
true
1
Exception in thread "Thread-0" java.lang.IllegalStateException: No match found
 at java.util.regex.Matcher.group(Unknown Source)
 at cs236369.proxy.Response.<init>(Response.java:27)
 at cs236369.proxy.ProxyServer.start(ProxyServer.java:71)
 at tests.Hw3Tests$1.run(Hw3Tests.java:29)
 at java.lang.Thread.run(Unknown Source)

  • Oben ist sehr suboptimaler Code. Es kann leicht umgeschrieben werden, um eine Konstante zu verwenden (static final Pattern), sodass das Muster nur einmal kompiliert werden muss. Darüber hinaus ist es sehr einfach, so umzuschreiben, dass nur ein einziges Matcher Instanz wird mit einem einzigen Aufruf an . abgerufen Pattern.matcher(String). Der Fehler beim Anrufen group() ohne matches() oder find() ist aber nicht ganz klar, es sollte nur ein werfen IllegalStateException stattdessen.

    – Maarten Bodewes

    8. August ’13 um 13:44

  • @MaartenBodewes Warum ist die Verwendung von Regex in Java so ausführlich?

    – Alex78191

    20. Februar ’19 um 17:31


Keine Ubereinstimmung gefunden bei Verwendung der Gruppenmethode des Matchers
Thomas

pattern.matcher(input) erstellt immer einen neuen Matcher, also musst du anrufen matches() wieder.

Versuchen:

Matcher m = responseCodePattern.matcher(firstHeader);
m.matches();
m.groupCount();
m.group(0); //must call matches() first
...

Sie überschreiben ständig die Übereinstimmungen, die Sie erhalten haben, indem Sie verwenden

System.out.println(responseCodePattern.matcher(firstHeader).matches());
System.out.println(responseCodePattern.matcher(firstHeader).groupCount());

Jede Zeile erstellt ein neues Matcher-Objekt.

Du solltest gehen

Matcher matcher = responseCodePattern.matcher(firstHeader);
System.out.println(matcher.matches());
System.out.println(matcher.groupCount());

  • Das ist der Kern des Problems: Matcher haben einen Status, also überschreibt das OP sie, wie Sie gesagt haben, ständig. Ein sehr leicht zu übersehender Fehler … und Sie haben es sehr gut erklärt.

    – Jason D

    28. Okt ’15 um 14:15


.

300060cookie-check“Keine Übereinstimmung gefunden” bei Verwendung der Gruppenmethode des Matchers

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

Privacy policy