修改正则表达式以获得更好的匹配

时间:2015-12-02 13:33:43

标签: java regex url match

考虑到我们有这个正则表达式匹配页面中的URL:

(https?):\\/\\/(www\\.)?[a-z0-9\\.:].*?(?=\\s)

我的问题是我们如何改进它,例如匹配:

http://stackoverflow.com/questions/ask

而不是:

http://stackoverflow.com/questions/ask">home</a></div><div>

简而言之,我希望它能过滤通常位于网页HTML代码中的网址之后的任何;:'".,<>?«»“”‘’

1 个答案:

答案 0 :(得分:0)

由于您已经在使用JSOUP,我认为获取所有链接的最佳方法是使用此库。它不会失去原创性,它是您的代码安全性,可读性和可维护性的问题。

来自hrefsrc属性的

Here is an example from Jsoup Cookbook how you can collect all links(基本上,从你的正则表达式中我看到你只想匹配那些):

List<String> links = new ArrayList<String>();
Document doc = Jsoup.connect(url).get();
Elements links = doc.select("a[href]");
Elements media = doc.select("[src]");
Elements imports = doc.select("link[href]");
for (Element src : media) {
    links.add(src.attr("abs:src"));
}
for (Element link : imports) {
    links.add(link.attr("abs:href"));
}
for (Element link : links) {
    links.add(link.attr("abs:href"));
}

请注意,此方法可让您获取所有绝对路径链接,即使是相对的链接。

如果您不需要并希望向老板炫耀,请尝试以下正则表达式:

https?://(?:www\\.)?[a-z0-9.:][^<>"]+

请参阅regex demo

此处,[^<>"]+匹配<>"以外的1个或多个符号。因此,它限制正则表达式不跨越属性边界。您也可以在那里添加'