2009-11-26 31 views
12

我試圖創建一個正則表達式來使用Java從文本文檔中提取URL,但到目前爲止我一直不成功。我期望捕獲的兩種情況如下所示:使用Java +正則表達式從文本文檔中提取URL

以http://開頭的網址:http:// 以www開頭的網址。 (從前面丟失協議)

以及查詢字符串參數。

謝謝!我希望我能更好地瞭解正則表達式。

乾杯,

+0

如果文本文檔是由人類寫的,你可能會在網址後,立即找東西如example.com,標點符號。你想要一個接受的答案來處理這個問題,還是這不相關? – 2009-11-26 22:54:27

+0

您尚未接受此問題的任何答案。沒有適合您的解決方案嗎?有什麼問題? – 2009-11-27 21:54:24

回答

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 
} 
26

如果你想確保你真正匹配網址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; 
    } 
} 
+2

嘿......我被引用了!好極了! – DVK 2009-11-27 00:51:02

+0

如果您不介意提取電子郵件地址,則可以替換權威部分(\\ w +:\\ w + @)? (\\ w +(:\\ w +)?@)? ,如果你不想取回電子郵件地址,那麼你需要添加一些其他檢查。 – GreenKiwi 2012-02-07 20:41:59

5

所有正則表達式爲基礎的代碼是過度設計,特別是來自得票最多的答案的代碼,這裏是爲什麼:它只會找到有效的網址!作爲一個示例,它將忽略以「http://」開頭且內部爲非ASCII字符的任何內容。

甚至更​​多:對於非常小而簡單的句子,我遇到了使用Java RegEx包的1-2秒處理時間(單線程,專用),沒有特定的;可能是Java 6正則表達式中的錯誤...

最簡單/最快速的解決方案是使用StringTokenizer將文本拆分爲令牌,以刪除以「http://」開頭的令牌,並將令牌再次串聯到文本中。

如果你真的想用正則表達式與Java,嘗試Automaton

+0

確實如此。有時你只需要基本的解析,雖然OP想要一個正則表達式,但這是救了我的那個人。謝謝。 – 2013-04-08 22:28:44