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 einzigesMatcher
Instanz wird mit einem einzigen Aufruf an . abgerufenPattern.matcher(String)
. Der Fehler beim Anrufengroup()
ohnematches()
oderfind()
ist aber nicht ganz klar, es sollte nur ein werfenIllegalStateException
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