简单的java正则expression式抛出illegalstateexception

我试图做一个快速的理智检查…及其失败。 这是我的代码 –

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。

您需要首先调用m.find()m.matches()才能使用m.group

  • find可以用来查找与你的模式匹配的每个子string(主要用于有多个匹配的情况)
  • matches将检查整个string是否匹配你的模式,所以你甚至不需要在你的模式中添加^$

我们也可以使用m.lookingAt()但现在让我们跳过它的描述(你可以在文档中阅读它)。

使用Matcher#matches或Matcher#find调用Matcher.group(int)

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

在这种情况下, Matcher#find比较合适,因为Matcher#matches匹配完整的String (在匹配expression式中使锚字符冗余)

Matcher的javadoc 。 你会看到“试图在成功匹配之前查询它的任何部分将导致抛出IllegalStateException”。

使用if (matcher.find()) {}来调用你的group(1)来解决这个问题。