使用 Java + 正则表达式从文本文档中提取 URL
我正在尝试创建一个正则表达式来使用Java从文本文档中提取URL,但到目前为止,我还没有成功。下面列出了我想要捕获的两个案例:
以 http:// 以 www 开头的网址。(缺少前面的协议)
以及查询字符串参数。
谢谢!我希望我真的更了解正则表达式。
干杯
我正在尝试创建一个正则表达式来使用Java从文本文档中提取URL,但到目前为止,我还没有成功。下面列出了我想要捕获的两个案例:
以 http:// 以 www 开头的网址。(缺少前面的协议)
以及查询字符串参数。
谢谢!我希望我真的更了解正则表达式。
干杯
如果你想确保你真的匹配一个网址地址,而不仅仅是一些以“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;
}
}
所有基于正则表达式的代码都是过度设计的,尤其是来自投票最多答案的代码,原因如下:它只会找到有效的URL!作为示例,它将忽略以“http://”开头且内部包含非 ASCII 字符的任何内容。
甚至更多:我遇到了1-2秒的处理时间(单线程,专用)与Java正则表达式包非常小和简单的句子,没有什么具体的;可能是 Java 6 正则表达式中的错误...
最简单/最快的解决方案是使用StringTokenizer将文本拆分为标记,删除以“http://”等开头的标记,并再次将标记连接成文本。
如果你真的想在Java中使用正则表达式,试试Automaton