我有一個FTP URL,並且必須解析URL來獲取用戶名,密碼,服務器名稱和目錄。經常做什麼可以做到這一點?Java的正則表達式解析URL
例如:ftp://userName:[email protected]/direcory-name
我有一個FTP URL,並且必須解析URL來獲取用戶名,密碼,服務器名稱和目錄。經常做什麼可以做到這一點?Java的正則表達式解析URL
例如:ftp://userName:[email protected]/direcory-name
每當我想到正則表達式,我認爲「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://([^:]+):([^@]+)@(.*?)/(.*?)(\\?.*)?$";
使用與模式/匹配器,你應該能夠很好地提取事情。
如果URL與預期不完全相同,則此正則表達式有問題;例如如果可選的userInfo不存在,或者如果有一個用戶名但沒有「:password」,或者如果有一個片段或者... –
使用java.net.URI
。它會更強大,並且可能會更快。
使用正則表達式的問題包括:
要麼過於簡單的處理邊緣的情況下,或太複雜/昂貴的,因爲它的情況下交易,
它不可能正確處理%編碼。
例如,由@Larry提交的(原始)正則表達式不處理URL沒有userInfo等的情況。
正如評論所述,URL是一個URI,但不是(必然)反之亦然。但是,我建議java.net.URI
的原因不是java.net.URL
是:
URI優於URL,還是它們差不多?如果可取,如何/爲什麼? –
URL(通用資源定位器)是URI(通用資源標識符)的子集。 URL的例子是使用以下方案之一的URI(「http://」,「ftp://」和「mailto:」)。在這種情況下,FTP鏈接是一個URL和一個URI。 –
@Ed - URL是一個URI,但反過來並不總是如此。 (一個URI可能是一個URN)。在Java中,URI類是更經常優選URL類由於URL的平等依賴於DNS解析(參照[有效的Java(http://java.sun.com/docs/books/effective/)),但選擇可能取決於正在使用的API。 (承認轉換相對容易)。合理? – Charlie
你試過java.net.URI中的? –