使用Java +正则表达式从文本文档中提取URL

rbu*_*ton 12 java regex url

我正在尝试创建一个正则表达式来使用Java从文本文档中提取URL,但到目前为止我还没有成功.我想要捕获的两个案例如下:

以http://以www开头的网址开头的网址.(从前面缺少协议)

以及查询字符串参数.

谢谢!我希望我真的更了解正则表达式.

干杯,

Phi*_*ier 27

如果你想确保你真正匹配一个网址,而不仅仅是一个以'www'开头的单词.您可以使用之前提到的DVK表达式.我稍微修改了它并写了一个小代码片段作为你的起点:

import java.util.*;
import java.util.regex.*;

class FindUrls
{
    public static List<String> extractUrls(String input) {
        List<String> result = new ArrayList<String>();

        Pattern pattern = Pattern.compile(
            "\\b(((ht|f)tp(s?)\\:\\/\\/|~\\/|\\/)|www.)" + 
            "(\\w+:\\w+@)?(([-\\w]+\\.)+(com|org|net|gov" + 
            "|mil|biz|info|mobi|name|aero|jobs|museum" + 
            "|travel|[a-z]{2}))(:[\\d]{1,5})?" + 
            "(((\\/([-\\w~!$+|.,=]|%[a-f\\d]{2})+)+|\\/)+|\\?|#)?" + 
            "((\\?([-\\w~!$+|.,*:]|%[a-f\\d{2}])+=?" + 
            "([-\\w~!$+|.,*:=]|%[a-f\\d]{2})*)" + 
            "(&(?:[-\\w~!$+|.,*:]|%[a-f\\d{2}])+=?" + 
            "([-\\w~!$+|.,*:=]|%[a-f\\d]{2})*)*)*" + 
            "(#([-\\w~!$+|.,*:=]|%[a-f\\d]{2})*)?\\b");

        Matcher matcher = pattern.matcher(input);
        while (matcher.find()) {
            result.add(matcher.group());
        }

        return result;
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 嘿......我被引用了!好极了! (2认同)

小智 5

所有基于RegEx的代码都是过度设计的,特别是来自最多投票答案的代码,这就是为什么:它只能找到有效的 URL!作为示例,它将忽略以"http://"开头且内部具有非ASCII字符的任何内容.

更多:我使用Java RegEx软件包遇到了1-2秒的处理时间(单线程,专用),用于非常小而简单的句子,没有什么特别的; 可能是Java 6 RegEx中的错误...

最简单/最快的解决方案是使用StringTokenizer将文本拆分为标记,删除以"http://"等开头的标记,并将标记再次连接到文本中.

如果您真的想将RegEx与Java一起使用,请尝试使用Automaton


DVK*_*DVK 3

这个链接有非常好的 URL 正则表达式(顺便说一句,它们非常难以正确使用 - 薄 http/https;端口号、有效字符、GET 字符串、锚链接的井号等...)

http://flanders.co.nz/2009/11/08/a-good-url-regular-expression-repost/

Perl 具有包含 cannedRegExes 的 CPAN 库,包括 URL。不过不确定 Java :(