Java正则表达式匹配器不匹配

时间:2013-05-24 09:00:51

标签: java regex pattern-matching

我的字符串:

<a href="https://MYURL/browse/TEST-53">FOO.BAR</a></p>

代码:

Pattern pattern = Pattern.compile("(browse/)(.*)(\">)");
Matcher matcher = pattern.matcher(match);

return matcher.group(1);

获取错误:

java.lang.IllegalStateException: No match found

在这里测试我的正则表达式,它确实匹配:

http://regexpal.com/?flags=g&regex=(browse%2F)(.*)(%5C%22%3E)&input=%3Ca%20href%3D%22https%3A%2F%2FMYURL%2Fbrowse%2FTEST-53%22%3EFOO.BAR%3C%2Fa%3E%3C%2Fp%3E

3 个答案:

答案 0 :(得分:9)

首先需要做

matcher.find()

触发实际搜索。通常是这样的:

Pattern pattern = Pattern.compile("(browse/)(.*)(\">)");
Matcher matcher = pattern.matcher(match);
if (matcher.find()) 
    return matcher.group(1);

你可能应该使用不同的正则表达式:

Pattern pattern = Pattern.compile("browse/([^<>\"]*)\">");

将更安全,更高效(并在组号1中提供正确的值)。

答案 1 :(得分:4)

在提取组之前,必须调用Matcher.find()或Matcher.matches()。

在您确切的情况下,您应该调用Matcher.find(),因为您的正则表达式与整个输入不匹配,这就是Matcher.matches()检查的内容。

答案 2 :(得分:0)

如果您使用Java&gt; 7.您可以定义组名称:

String TEXT = "<a href=\"https://MYURL/browse/TEST-53\">FOO.BAR</a></p>"
        +"<a href=\"https://MYURL/browse/TEST2\">FOO2.BAR</a></p>" ;

// Define group named value  (?<groupName>regexHere)
// *?  ==>  ? after a quantifier makes it a reluctant quantifier. 
// It tries to find the smallest match.
String regex = "browse/(?<value>.*?)\">";

Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(TEXT);

while (matcher.find()) {
    // Get group by name.
    System.out.println("Value = " + matcher.group("value"));
}

结果:

Value = TEST-53
Value = TEST2

更多Group Name教程。