我試圖創建一個正則表達式來使用Java從文本文檔中提取URL,但到目前爲止我一直不成功。我期望捕獲的兩種情況如下所示:使用Java +正則表達式從文本文檔中提取URL
以http://開頭的網址:http:// 以www開頭的網址。 (從前面丟失協議)
以及查詢字符串參數。
謝謝!我希望我能更好地瞭解正則表達式。
乾杯,
我試圖創建一個正則表達式來使用Java從文本文檔中提取URL,但到目前爲止我一直不成功。我期望捕獲的兩種情況如下所示:使用Java +正則表達式從文本文檔中提取URL
以http://開頭的網址:http:// 以www開頭的網址。 (從前面丟失協議)
以及查詢字符串參數。
謝謝!我希望我能更好地瞭解正則表達式。
乾杯,
This link有很好的URL RegExs(他們是令人驚訝的很難得到正確,順便說一句 - THINH HTTP/HTTPS;端口#秒,有效的人物,讓錨鏈接字符串,井號,等等...)
http://flanders.co.nz/2009/11/08/a-good-url-regular-expression-repost/
Perl有包含cannedRegExes,包括網址CPAN庫。不知道關於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
}
如果你想確保你真正匹配網址ADRESS,並開始不僅一些字的「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+:\\[email protected])?(([-\\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;
}
}
所有正則表達式爲基礎的代碼是過度設計,特別是來自得票最多的答案的代碼,這裏是爲什麼:它只會找到有效的網址!作爲一個示例,它將忽略以「http://」開頭且內部爲非ASCII字符的任何內容。
甚至更多:對於非常小而簡單的句子,我遇到了使用Java RegEx包的1-2秒處理時間(單線程,專用),沒有特定的;可能是Java 6正則表達式中的錯誤...
最簡單/最快速的解決方案是使用StringTokenizer將文本拆分爲令牌,以刪除以「http://」開頭的令牌,並將令牌再次串聯到文本中。
如果你真的想用正則表達式與Java,嘗試Automaton
確實如此。有時你只需要基本的解析,雖然OP想要一個正則表達式,但這是救了我的那個人。謝謝。 – 2013-04-08 22:28:44
如果文本文檔是由人類寫的,你可能會在網址後,立即找東西如example.com,標點符號。你想要一個接受的答案來處理這個問題,還是這不相關? – 2009-11-26 22:54:27
您尚未接受此問題的任何答案。沒有適合您的解決方案嗎?有什麼問題? – 2009-11-27 21:54:24