Java Regex解析URL

时间:2011-07-19 01:09:31

标签: java regex

我有一个FTP URL,必须解析URL以获取用户名,密码,服务器名称和目录。什么可以成为常规exp?

ex:ftp://userName:password@someServer/direcory-name

2 个答案:

答案 0 :(得分:6)

使用java.net.URI。它会更强大,并且可能会更快。

使用正则表达式的问题包括:

  • 要么处理边缘情况太简单,要么太复杂/昂贵,因为它处理这些情况,

  • 不太可能正确处理%-encoding。

例如,由@Larry提交的(原始)正则表达式不处理URL没有userInfo等的情况。


正如评论所述,URL是URI,但不是(必然),反之亦然。但我推荐java.net.URI而不是java.net.URL的原因是:

  • 它有一个更好的解析器,
  • 它有一个更好的API,用于检查已解析网址的各个部分。

答案 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一起使用,您应该可以很好地提取内容。