I'm using Pattern
/Matcher
to get the response code in an HTTP response. groupCount
returns 1, but I get an exception when trying to get it! Any idea why?
Here's the 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));
And here's the output:
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)
pattern.matcher(input)
always creates a new matcher, so you'd need to call matches()
again.
Try:
Matcher m = responseCodePattern.matcher(firstHeader);
m.matches();
m.groupCount();
m.group(0); //must call matches() first
...
You are constantly overwriting the matches you got by using
System.out.println(responseCodePattern.matcher(firstHeader).matches());
System.out.println(responseCodePattern.matcher(firstHeader).groupCount());
Each line creates a new Matcher object.
You should go
Matcher matcher = responseCodePattern.matcher(firstHeader);
System.out.println(matcher.matches());
System.out.println(matcher.groupCount());
I was experiencing the same, but I'm writing this answer because I noticed something else:
As others stated, you have to call either
matcher.matches()
or
matcher.find();
Before you are able to call
matcher.group(1);
However, if you are using the results() call, you won't explicitly have to call those methods above and the results are immediately available.
pattern
.matcher(pathname)
.results()
.collect(Collectors.toList())
.get(0)
.group(1);
I think this is intentionally the case, but I'm just adding it here in addition
No need to call matcher.find() or matcher.matches() when using matcher.results().
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With