我的字符串:
<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®ex=(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
答案 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教程。