为什么这种模式匹配代码不起作用?

时间:2014-03-18 06:00:06

标签: java regex

我试图在Java中进行一些模式匹配:

Pattern p = Pattern.compile("(\\d+) (\\.+)");
Matcher m = p.matcher("5 soy milk");
String qty = m.group(1);
String name = m.group(2);

我想最终得到一个包含" 5"和一个包含"豆浆"的字符串。但是,这种模式匹配代码给我一个IllegalStateException。

2 个答案:

答案 0 :(得分:2)

在尝试获取群组之前,您必须先致电matches()

http://docs.oracle.com/javase/7/docs/api/java/util/regex/Matcher.html#matches()

  

public boolean matches()

     

尝试将整个区域与模式匹配。   如果匹配成功,则可以通过start,end和group方法获得更多信息。

试试这个:

Pattern p = Pattern.compile("(\\d+) (\\.+)");
Matcher m = p.matcher("5 soy milk");

if (m.matches())
{
  String qty = m.group(1);
  String name = m.group(2);
}

答案 1 :(得分:1)

这是因为您没有发起Matcher。您应该p.matcher(...).matches()(或.find().lookingAt(),具体取决于所需的行为 - 使用.find()进行真正的正则表达式匹配。

并检查.matches()的结果,因为在您的情况下它返回 false \.+(Java字符串中的"\\.+")将尝试匹配一个点一次或多次;您应该使用.+(Java字符串中的".+")来匹配"任何字符,一次或多次"。