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

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

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

连同查询字符串参数。

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

干杯,

【问题讨论】:

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

标签: java regex 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\\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;
    }
}

【讨论】:

  • 如果您不介意它提取电子邮件地址,您可以替换权限部分(\\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
    }
    

    【讨论】:

      猜你喜欢
      • 2019-09-14
      • 1970-01-01
      • 2011-09-21
      • 2015-01-16
      • 1970-01-01
      • 2011-04-26
      • 2017-10-08
      • 1970-01-01
      • 2016-09-04
      相关资源
      最近更新 更多