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

2022-09-05 00:32:24

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

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

以及查询字符串参数。

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

干杯


答案 1

如果你想确保你真的匹配一个网址地址,而不仅仅是一些以“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;
    }
}

答案 2

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

甚至更多:我遇到了1-2秒的处理时间(单线程,专用)与Java正则表达式包非常小和简单的句子,没有什么具体的;可能是 Java 6 正则表达式中的错误...

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

如果你真的想在Java中使用正则表达式,试试Automaton