6

Im trying to do a quick sanity check... and its failing. Here is my code -

import java.util.regex.*;

public class Tester {
    public static void main(String[] args) {
        String s = "a";
        Pattern p = Pattern.compile("^(a)$");
        Matcher m = p.matcher(s);
        System.out.println("group 1: " +m.group(1));
    } 
}

And what I would expect is to see group 1: a. But instead I get an IllegalStateException: no match found and I have no idea why.

Edit: I also tries printing out groupCount() and it says there is 1.

David says Reinstate Monica
  • 18,041
  • 20
  • 73
  • 118

3 Answers3

14

You need to invoke m.find() or m.matches() first to be able to use m.group.

  • find can be used to find each substring that matches your pattern (used mainly in situations where there is more than one match)
  • matches will check if entire string matches your pattern so you wont even need to add ^ and $ in your pattern.

We can also use m.lookingAt() but for now lets skip its description (you can read it in documentation).

Pshemo
  • 118,400
  • 24
  • 176
  • 257
4

Use Matcher#matches or Matcher#find prior to invoking Matcher.group(int)

if (m.find()) {
   System.out.println("group 1: " +m.group(1));
}

In this case Matcher#find is more appropriate as Matcher#matches matches the complete String (making the anchor characters redundant in the matching expression)

Reimeus
  • 155,977
  • 14
  • 207
  • 269
3

Look at the javadocs for Matcher. You will see that "attempting to query any part of it before a successful match will cause an IllegalStateException to be thrown".

Wrap your group(1) call with if (matcher.find()) {} to resolve this problem.

Sam Marsh
  • 166
  • 2
  • 6