问题
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.
回答1:
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).
回答2:
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)
回答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.
来源:https://stackoverflow.com/questions/18257561/simple-java-regex-throwing-illegalstateexception