工具方法:
/**
* 解析target,并返回pattern匹配到的结果集合,不包括整个字符都匹配的情况
* @param target
* @param pattern
* @return
*/
public static List<String> patternParseGroup(String target, String pattern) {
List<String> result = new ArrayList<String>();
// 如果不添加Pattern.DOTALL,那么匹配到字符串中的换行(\n)时,匹配会提前结束。导致后面字符的匹配不到
Pattern p = Pattern.compile(pattern, Pattern.DOTALL);
Matcher m = p.matcher(target);
while (m.find()) {
int count = m.groupCount();
for (int i = 0; i < count; i++) {
// 忽略整个字符匹配的情况,所以跳过了m.group(0)
result.add(m.group(i + 1));
}
}
return result;
}
测试方法:
public static void main(String[] args) {
System.out.println(patternParseGroup("<a href=\"http://www.99.com.cn/pifu/\" target=\"_blank\">皮肤科</a>", "href=\"(.*)\">(.*)<"));
// 这里的‘?’,是勉强模式,也叫最小匹配。即找到最小的结果就停止。这种方法可以匹配到格式相同的多个组
// 而没有‘?’的,是贪婪模式,也叫最大匹配。即找到最大的结果才停止。
System.out.println(patternParseGroup(" {A0111} 和 {A0117} ", "\\{(.*?)\\}"));
String img = "<img src=\"000\" ><img data-src=\"111\" width=\"\" src=\"222\"> xxx <img src=\"000\" > xxx <img data-src=\"333\" width=\"\" src=\"44+44\">";
System.out.println(patternParseGroup(img, "<img.*?data-src=\"(.*?)\".*?src=\"(.*?)\">"));
}
输出:
[http://www.99.com.cn/pifu/" target="_blank, 皮肤科]
[A0111, A0117]
[111, 222, 333, 444]