4

我的字符串:

<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
4

3 回答 3

12

你首先需要做

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 组中提供正确的值)。

于 2013-05-24T09:03:11.943 回答
5

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

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

于 2013-05-24T09:03:30.433 回答
0

如果您使用 Java > 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

更多关于组名教程。

于 2014-11-16T02:19:29.597 回答