如何调整此正则表达式以过滤掉“

时间:2013-11-02 12:56:21

标签: java html regex hyperlink

我有以下正则表达式在页面中搜索视频链接

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

不幸的是,如果在其后面还有另一场比赛,它不会在链接的末尾停止,例如此视频链接

<a href="http://somevideo.flv">somevideoname.avi</a>
在正则表达式返回后,

会发生:

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

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

4 个答案:

答案 0 :(得分: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("------");
    }
}

答案 1 :(得分:1)

我不确定我理解你的正则表达式中的分组。无论如何,这个应该有效:

\\bhttps?://[^\"]+?\\.(?:avi|flv|mp4)\\b

答案 2 :(得分:1)

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

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

这应匹配“href”后跟双引号或单引号字符,然后捕获所有内容(包括)与起始引号字符匹配的下一个字符。然后你的href属性可以通过

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

将文件路径和名称与句点连接,然后连接文件扩展名。

答案 3 :(得分:1)

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

限制其贪婪read this

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