我有以下正则表达式在页面中搜索视频链接
(http(s?):/)(/[^/]+)\\S+.\\.(?:avi|flv|mp4)
不幸的是,如果在其后面还有另一场比赛,它不会在链接的末尾停止,例如此视频链接
<a href="http://somevideo.flv">somevideoname.avi</a>
在正则表达式返回后,会发生:
http://somevideo.flv">somevideoname.avi
如何调整正则表达式以避免这种情况?我想了解更多有关正则表达式的信息,它非常有趣但很复杂!
答案 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)