正则表达式:在URI中匹配域

时间:2011-01-08 22:23:41

标签: .net regex vb.net

如何仅将URI的域部分与正则表达式匹配?我看到很多例子,但是也可以看到子域名。我要做的是只捕获域名,但我无法弄明白。

因此,例如http://foo.google.tdl/bar应仅匹配google

作为第二个问题,我希望在VB.NET程序上实现它。没有正则表达式会有其他方法吗?

2 个答案:

答案 0 :(得分:2)

尝试一下:

^[^\/]+:\/\/[^\/]*?\.?([^\/.]+)\.[^\/.]+(?::\d+)?\/

http://www.rubular.com/r/Uv5ON7eAz4

^             # Match the beginning of the string
[^\/]+:\/\/   # Match the protocol (e.g. http://)
[^\/]*?       # Non-greedy match of the sub-domains
\.?           # Optional . (for when a sub-domain is used)
([^\/.]+)     # Group the domain
\.            # . between domain and tld
[^\/.]+       # tld
(?::\d+)?     # Optional port
\/            # Slash between tld and path

答案 1 :(得分:1)

不了解VB.NET,但如果您只想要域名部分,并且您确定始终拥有相同的协议,则可以通过四个简单步骤实现目标:

  1. 从URI中删除协议(在您的情况下为http://);
  2. 在第一个/出现时拆分剩余部分并保留第一部分;
  3. 最后拆分剩下的部分。发生并保留第一部分。
  4. 最后拆分剩下的部分。发生并保留最后一部分。
  5. 在python中,这大致相当于:

    uri = uri.replace('http://', '')
    uri = uri.split('/', 1)[0]
    uri = uri.rsplit('.', 1)[0]
    uri = uri.rsplit('.', 1)[1]
    

    显然,这仅适用于您的特定情况(http前缀,顶级域名),但如果提供的uri未指定协议,没有路径,没有子域,则通常可以工作......