2011-07-19 197 views

回答

1

每當我想到正則表達式,我認爲「Perl」並寫出一個快速和骯髒的模式(qr {xxx} x)並根據測試輸入進行測試。

在你的情況下,假設用戶名,密碼,服務器和目錄名都需要被解析出(和是強制性的),我會使用以下。添加問號您模式「可選」部分,如果你想修改此:

qr{ 
    ^   # Start of text 
    ftp:  # Protocol 
    //   # Double slash 
    ([^:]+)  # $1 = User Name 
    :   # Colon 
    ([^@]+)  # $2 = Password 
    @   # AT sign 
    (.*?)  # $3 = Server name 
    /   # Single slash 
    (.*?)  # $4 = Directory name 
    (\?.*)?  # Question mark ends URI 
    $   # End of text 
}x; 

現在,我們有模式,只需雙擊反斜槓(在「問號」部分),刪除空格和評論(如果你願意的話),並放入一個Java字符串:

"^ftp://([^:]+):([^@]+)@(.*?)/(.*?)(\\?.*)?$"; 

使用與模式/匹配器,你應該能夠很好地提取事情。

+1

如果URL與預期不完全相同,則此正則表達式有問題;例如如果可選的userInfo不存在,或者如果有一個用戶名但沒有「:password」,或者如果有一個片段或者... –

6

使用java.net.URI。它會更強大,並且可能會更快。

使用正則表達式的問題包括:

  • 要麼過於簡單的處理邊緣的情況下,或太複雜/昂貴的,因爲它的情況下交易,

  • 它不可能正確處理%編碼。

例如,由@Larry提交的(原始)正則表達式不處理URL沒有userInfo等的情況。


正如評論所述,URL是一個URI,但不是(必然)反之亦然。但是,我建議java.net.URI的原因不是java.net.URL是:

  • 它具有更好的解析器和
  • 它用於檢查解析URL的部分更好的API。
+0

URI優於URL,還是它們差不多?如果可取,如何/爲什麼? –

+0

URL(通用資源定位器)是URI(通用資源標識符)的子集。 URL的例子是使用以下方案之一的URI(「http://」,「ftp://」和「mailto:」)。在這種情況下,FTP鏈接是一個URL和一個URI。 –

+0

@Ed - URL是一個URI,但反過來並不總是如此。 (一個URI可能是一個URN)。在Java中,URI類是更經常優選URL類由於URL的平等依賴於DNS解析(參照[有效的Java(http://java.sun.com/docs/books/effective/)),但選擇可能取決於正在使用的API。 (承認轉換相對容易)。合理? – Charlie