我试图快速进行健全检查......而且它失败了。这是我的代码 -
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));
}
}
我期望看到group 1: a
。但相反,我得到IllegalStateException: no match found
,我不明白为什么。
编辑:我也尝试打印groupCount()
,它说有1。
答案 0 :(得分:11)
您需要先调用m.find()
或m.matches()
才能使用m.group
。
find
可用于查找与您的模式匹配的每个子字符串(主要用于存在多个匹配的情况)matches
会检查整个字符串是否与您的模式匹配,因此您甚至无需在模式中添加^
和$
。我们也可以使用m.lookingAt()
但是现在让我们跳过它的描述(你可以在文档中阅读)。
答案 1 :(得分:4)
在调用Matcher.group(int)
if (m.find()) {
System.out.println("group 1: " +m.group(1));
}
在这种情况下,Matcher#find
更合适,因为Matcher#matches
匹配完整的String
(使得匹配表达式中的锚字符多余)
答案 2 :(得分:2)
查看Matcher
的{{3}}。您将看到“在成功匹配之前尝试查询它的任何部分将导致抛出IllegalStateException”。
使用group(1)
传送if (matcher.find()) {}
来电来解决此问题。