使用java和正则表达式查找最后一次出现

时间:2015-09-05 09:21:27

标签: java regex

我正在从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 
    }

先谢谢

4 个答案:

答案 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解析器。从可读性的角度来看,它已经过测试和良好

请参阅finding last occurrence using jsoup

答案 3 :(得分:0)

使用贪婪量词*.来查找最后一次出现。

(?s)^.*<span[^>]*>(.*?)</span>

第一组matcher3.group(1) regexplanet demo

的捕获