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
  • 19,209
  • 22
  • 79
  • 122

3 Answers3

15

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
  • 122,468
  • 25
  • 185
  • 269
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
  • 158,255
  • 15
  • 216
  • 276
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