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

Posted

技术标签:

【中文标题】使用 Java + 正则表达式从文本文档中提取 URL【英文标题】:Extracting URLs from a text document using Java + Regular Expressions 【发布时间】:2010-12-20 19:58:15 【问题描述】:

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

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

连同查询字符串参数。

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

干杯,

【问题讨论】:

如果文本文档是由人类编写的,您可能会发现类似 example.com 的内容,标点符号紧跟在 URL 之后。你想要一个公认的答案来处理这个问题,还是这不相关? 您尚未接受此问题的任何答案。没有适合您的解决方案吗?有什么问题? 【参考方案1】:

如果您想确保您真正匹配的是一个 url 地址,而不仅仅是一些以“www”开头的单词。你可以使用之前DVK提到的表达式。我稍微修改了一下,写了一个小代码sn-p作为你的起点:

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\\d2])+=?" + 
            "([-\\w~!$+|.,*:=]|%[a-f\\d]2)*)" + 
            "(&(?:[-\\w~!$+|.,*:]|%[a-f\\d2])+=?" + 
            "([-\\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;
    

【讨论】:

如果您不介意它提取电子邮件地址,您可以替换权限部分(\\w+:\\w+@)吗?与 (\\w+(:\\w+)?@)? ,如果您希望它不接收电子邮件地址,那么您需要添加一些其他检查。【参考方案2】:

所有基于 RegEx 的代码都过度设计,尤其是来自投票最多的答案的代码,原因如下:它只会找到 有效 em> 网址!作为示例,它将忽略以“http://”开头且内部包含非 ASCII 字符的任何内容。

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

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

如果你真的想在 Java 中使用 RegEx,试试Automaton

【讨论】:

确实如此。有时你只需要基本的解析,虽然 OP 想要一个正则表达式,但这是拯救我的分析器。谢谢。【参考方案3】:

This link 具有非常好的 URL 正则表达式(顺便说一下,它们很难正确处理 - 薄 http/https;端口号、有效字符、GET 字符串、用于锚链接的井号等...)

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

Perl 的 CPAN 库包含 cannedRegExes,包括 URL。虽然不确定Java :(

【讨论】:

【参考方案4】:

这会测试某行是否是 URL

Pattern p = Pattern.compile("http://.*|www\\..*");
Matcher m = p.matcher("http://..."); // put here the line you want to check
if(m.matches())
    so something

【讨论】:

以上是关于使用 Java + 正则表达式从文本文档中提取 URL的主要内容,如果未能解决你的问题,请参考以下文章

sklearn - 从文本文档中预测多标签分类中的前 3-4 个标签

如何从文本文档中预测连续值(时间)? [关闭]

使用 Wordnet 进行概念提取

从文本文档图像中提取文本检测特征

如何使用正则表达式从文本行中捕获 3 个不同的部分

文本区域输入上的 JavaScript 正则表达式