0

我得到以下正则表达式来搜索页面中的视频链接

(http(s?):/)(/[^/]+)\\S+.\\.(?:avi|flv|mp4)

不幸的是,如果后面有另一个匹配项,它不会在链接末尾停止,例如这个视频链接

<a href="http://somevideo.flv">somevideoname.avi</a>

将在正则表达式返回此之后:

http://somevideo.flv">somevideoname.avi

如何调整正则表达式以避免这种情况?我想了解更多关于正则表达式的信息,它很迷人但又很复杂!

4

4 回答 4

2

这是使用 JSoup 解析器执行类似操作的方法。

Scanner scanner = new Scanner(new File("input.txt"));
scanner.useDelimiter("\\Z");
String htmlString = scanner.next();
scanner.close();

Document doc = Jsoup.parse(htmlString);
// or to get connect of some page use
// Document doc = Jsoup.connect("http://example.com/").get();
Elements elements = doc.select("a[href]");//find all anchors with href attribute
for (Element el : elements) {
    URL url = new URL(el.attr("href"));
    if (url.getPath().matches(".*\\.(?:avi|flv|mp4)")) {
        System.out.println("url: " + url);
        //System.out.println("file: " + url.getPath());
        System.out.println("file name: "
                + new File(url.getPath()).getName());
        System.out.println("------");
    }
}
于 2013-11-02T13:55:44.583 回答
1

我不确定我是否理解您的正则表达式中的分组。无论如何,这个应该可以工作:

\\bhttps?://[^\"]+?\\.(?:avi|flv|mp4)\\b
于 2013-11-02T12:58:12.217 回答
1

如果您只想提取 href 属性值,那么您最好匹配以下模式:

href=("|')(.*?)\.(avi|flv|mp4)\1

这应该匹配 "href" 后跟双引号或单引号字符,然后捕获直到(包括)与起始引号字符匹配的下一个字符为止的所有内容。然后可以通过以下方式提取您的 href 属性

matcher.group(2) + "." + matcher.group(3)

将文件路径和名称与句点和文件扩展名连接起来。

于 2013-11-02T13:32:20.310 回答
1

你的正则表达式是贪婪的:

限制它的贪婪阅读

(http(s?):/)(/[^/]+?)\\S+.\\.(?:avi|flv|mp4)
于 2013-11-02T13:34:34.940 回答