我正在尝试创建一个正则表达式来使用Java从文本文档中提取URL,但到目前为止我还没有成功。我想要捕获的两个案例如下:
以http://开头的网址 以www开头的网址。 (从前面缺少协议)
以及查询字符串参数。
谢谢!我希望我真的更了解正则表达式。
干杯,
答案 0 :(得分:26)
如果你想确保你真正匹配网址,而不仅仅是以'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;
}
}
答案 1 :(得分:5)
所有基于 RegEx 的代码过度设计,尤其是来自最多投票答案的代码,原因如下:它只会找到有效网址!作为示例,它将忽略以“http://”开头且内部具有非ASCII字符的任何内容。
更多:我遇到了1-2秒的处理时间(单线程,专用)和Java RegEx包,用于非常小而简单的句子,没有具体的内容;可能是Java 6 RegEx中的错误...
最简单/最快的解决方案是使用StringTokenizer将文本拆分为标记,删除以“http://”等开头的标记,并将标记再次连接成文本。
如果您真的想将RegEx与Java一起使用,请尝试Automaton
答案 2 :(得分:3)
This link有非常好的URL RegEx(顺便说一下,它们很难做到 - 瘦http / https;端口#s,有效字符,GET字符串,锚链接的井号等等。 。)
http://flanders.co.nz/2009/11/08/a-good-url-regular-expression-repost/
Perl具有包含cannedRegExes的CPAN库,包括URL。虽然不确定Java :(
答案 3 :(得分:1)
如果它是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
}