使用java和正则表达式查找最后一个匹配项

carvr3hs  于 2023-01-07  发布在  Java
关注(0)|答案(4)|浏览(876)

我从XML接收HTML代码,并尝试在Java中查找last。当我运行代码时,我总是收到第一个span,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 
    }
lmvvr0a8

lmvvr0a81#

您可以再次调用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>标记中的内容,您可以使用regex "<span>(.*?)</span>"matcher3.group(1)来获取第一对()中的内容(或者将标记置于lookahead和lookahead中,但恕我直言,这种方式更容易)。

sqxo8psd

sqxo8psd2#

虽然你已经要求使用regex查找最后一个匹配项,但是也可以考虑使用jsoup,它是一个经过java测试的HTML解析器库,它已经经过测试,从可读性的Angular 来看很好
请参见使用jsoup查找最后一个匹配项

fafcakar

fafcakar3#

将贪婪量词*.一起使用,以查找最后一个出现的值。

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

第一组捕获数matcher3.group(1)regexplanet demo

mwkjh3gx

mwkjh3gx4#

试试这个:

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()); 
    }

相关问题