我有一个FTP URL,必须解析URL以获取用户名,密码,服务器名称和目录。什么可以成为常规exp?
答案 0 :(得分:6)
使用java.net.URI
。它会更强大,并且可能会更快。
使用正则表达式的问题包括:
要么处理边缘情况太简单,要么太复杂/昂贵,因为它处理这些情况,
不太可能正确处理%-encoding。
例如,由@Larry提交的(原始)正则表达式不处理URL没有userInfo等的情况。
正如评论所述,URL是URI,但不是(必然),反之亦然。但我推荐java.net.URI
而不是java.net.URL
的原因是:
答案 1 :(得分: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://([^:]+):([^@]+)@(.*?)/(.*?)(\\?.*)?$";
将它与Pattern / Matcher一起使用,您应该可以很好地提取内容。