Reputation: 79695
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)
Upvotes: 83
Views: 74823
Reputation: 17687
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 can 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().
Upvotes: 10
Reputation: 88747
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
...
Upvotes: 130
Reputation: 30994
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());
Upvotes: 16