我正在从XML接收HTML代码并试图在Java中找到最后一个。 当我运行代码时,我总是收到第一个跨度,groupCount告诉我只有一个匹配(第一个)。 我还尝试使用XML的硬编码版本(我创建了一个字符串变量,但仍然得到了相同的结果)
这是我的代码:
String text = "<div><ul ><li><span>answer 1.</span></li><li><span>answer 2</span></li><li><span>answer3.</span></li><li><span>answer 4</span></li></ul><div><span>Cat 1 | Cat 2 | Cat 3</span></div></div>"
Pattern pattern3 = Pattern.compile("<span.*?(?=</span>)");
Matcher matcher3 = pattern3.matcher(desc);
if (matcher3.find()) {
int result = matcher3.groupCount();
String s = (matcher3.group(result))//->>always show the first result
}
先谢谢
答案 0 :(得分:2)
您可以再次致电matcher.find
,它会找到下一场比赛。它不仅会告诉你它是否发现了什么,它还会主动搜索下一场比赛。在您拨打一次之后,您只能获得第一场比赛。再次拨打电话时,下次拨打matcher.group
即可获得第二场比赛,依此类推。重复直到找不到任何结果,而不是取最后一个结果。此外,您实际上并不需要groupCount
,因为匹配中的组总数相同 - 零。
String text = "<div><ul ><li><span>answer 1.</span></li><li><span>answer 2</span></li><li><span>answer3.</span></li><li><span>answer 4</span></li></ul><div><span>Cat 1 | Cat 2 | Cat 3</span></div></div>";
Pattern pattern3 = Pattern.compile("<span.*?(?=</span>)");
Matcher matcher3 = pattern3.matcher(text);
String s = null;
while (matcher3.find()) {
s = matcher3.group();
}
System.out.println(s);
输出为<span>Cat 1 | Cat 2 | Cat 3
。
如果您想使用<span>
标记中的内容,可以使用正则表达式"<span>(.*?)</span>"
和matcher3.group(1)
来获取第一对()
内的内容(或放置)在lookahead和lookbehind中的标签,但恕我直言,这样更容易。)
答案 1 :(得分:0)
试试这个:
String text = "<div><ul ><li><span>answer 1.</span></li><li><span>answer 2</span></li><li><span>answer3.</span></li><li><span>answer 4</span></li></ul><div><span>Cat 1 | Cat 2 | Cat 3</span></div></div>"
Pattern pattern3 = Pattern.compile("<span.*?(?=</span>)");
Matcher matcher3 = pattern3.matcher(text);
if (matcher3.find()) {
String in= matcher3.group(matcher3.groupCount());
}
答案 2 :(得分:0)
虽然您要求使用正则表达式找到最后一次出现。但也考虑使用jsoup这是java测试库的html解析器。从可读性的角度来看,它已经过测试和良好
答案 3 :(得分:0)