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

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

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

以及查询字符串参数。

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

干杯,

如果你想确保你真正匹配一个url,而不仅仅是一个以’www’开头的单词。 您可以使用DVK之前提到的表达式。 我稍微修改了它并写了一个小代码片段作为你的起点:

import java.util.*; import java.util.regex.*; class FindUrls { public static List extractUrls(String input) { List result = new ArrayList(); 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|[az]{2}))(:[\\d]{1,5})?" + "(((\\/([-\\w~!$+|.,=]|%[af\\d]{2})+)+|\\/)+|\\?|#)?" + "((\\?([-\\w~!$+|.,*:]|%[af\\d{2}])+=?" + "([-\\w~!$+|.,*:=]|%[af\\d]{2})*)" + "(&(?:[-\\w~!$+|.,*:]|%[af\\d{2}])+=?" + "([-\\w~!$+|.,*:=]|%[af\\d]{2})*)*)*" + "(#([-\\w~!$+|.,*:=]|%[af\\d]{2})*)?\\b"); Matcher matcher = pattern.matcher(input); while (matcher.find()) { result.add(matcher.group()); } return result; } } 

所有基于RegEx的代码都是过度设计的 ,特别是来自最多投票答案的代码,这就是为什么:它只能找到有效的 URL! 作为示例,它将忽略以“http://”开头且内部具有非ASCII字符的任何内容。

更多:我遇到了1-2秒的处理时间(单线程,专用)和Java RegEx包,用于非常小而简单的句子,没有具体的内容; 可能是Java 6 RegEx中的错误…

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

如果您真的想将RegEx与Java一起使用,请尝试使用Automaton

这个链接有很好的URL RegEx(顺便说一句,它们很难正确 – 瘦http / https;端口#,有效字符,GET字符串,锚链接的井号等等)

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

Perl具有包含cannedRegExes的CPAN库,包括URL。 虽然不确定Java 🙁

如果它是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 }