我想知道为什么这个正则表达式组在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
答案 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]+)");
答案 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