RegEx模式在JAVA中不匹配

时间:2017-06-12 03:00:40

标签: java regex

我想知道为什么这个正则表达式组在JAVA中不适合我?找到组的匹配时它会抛出异常。我试图匹配用破折号分隔的数字。

Pattern p = Pattern.compile("([0-9]+)-([0-9]+)-([0-9]+)-([0-9]+)-([0-9]+)");
Matcher matcher = p.matcher("1-1-3-1-4");
matcher.group(0); // Exception happens here - java.lang.IllegalStateException: No match found

2 个答案:

答案 0 :(得分:4)

您需要致电Matcher#find()以实际获得匹配:

Pattern p = Pattern.compile("([0-9]+)-([0-9]+)-([0-9]+)-([0-9]+)-([0-9]+)");
Matcher matcher = p.matcher("1-1-3-1-4");
if (matcher.find()) {
    System.out.println(matcher.group(0))
}

如果您期望多次匹配,则可以使用while循环而不是if语句。

另请注意,您的模式中实际上有五个捕获组。通过将模式的一部分放在括号中来表示捕获组。如果您不打算/需要单独捕获模式中的五个分隔数字,那么您可以考虑告诉正则表达式引擎捕获它们,例如用这个:

Pattern p = Pattern.compile("(?:[0-9]+)-(?:[0-9]+)-(?:[0-9]+)-(?:[0-9]+)-(?:[0-9]+)");

Demo

答案 1 :(得分:1)

在Java正则表达式 index study 方法用于返回Matcher类匹配:

if (matcher.matches()) {
    System.out.println(matcher.group(0));
}

在上面的示例中,matches() " study" 方法尝试将整个区域与给定模式匹配。您使用哪种方法通常表示您想要匹配的内容/方式。

匹配()

  

尝试将整个区域与模式匹配。

find()

  

尝试查找输入序列的下一个子序列   与模式匹配。

研究方法检查输入字符串并返回一个布尔值,指示是否找到模式

http://docs.oracle.com/javase/tutorial/essential/regex/matcher.html