正则表达式从FQDN提取二级域名?

时间:2009-11-21 04:45:06

标签: asp.net-mvc vb.net

我无法弄清楚这一点。我需要从FQDN中提取二级域。例如,所有这些都需要返回“example.com”:

  1. example.com
  2. foo.example.com
  3. bar.foo.example.com
  4. example.com:8080
  5. foo.example.com:8080
  6. bar.foo.example.com:8080
  7. 这是我到目前为止所拥有的:

        Dim host = Request.Headers("Host")
        Dim pattern As String = "(?<hostname>(\w+)).(?<domainname>(\w+.\w+))"
        Dim theMatch = Regex.Match(host, pattern)
        ViewData("Message") = "Domain is: " + theMatch.Groups("domainname").ToString
    

    example.com:8080bar.foo.example.com:8080失败。有什么想法吗?

3 个答案:

答案 0 :(得分:5)

我成功使用此Regex来匹配测试用例列表中的“example.com”。

"(?<hostname>(\w+\.)*)(?<domainname>(\w+\.\w+))"

点字符(“。”)需要转义为“\。”。 “。”正则表达式模式中的字符匹配任何字符。

此外,您提供的正则表达式模式要求在域名匹配之前有一个或多个单词字符后跟一个点(此部分为“(?(\ w +))。”模式。此外,我假设。字符应该被转义)。这无法匹配输入“example.com”,因为在域名匹配之前没有单词字符和点。

我更改了模式,以便主机名匹配将包含零个或多个匹配的“1个或多个单词字符后跟一个点”。这将匹配“foo.example.com”中的“foo”和“foo.bar.example.com”中的“foo.bar”。

答案 1 :(得分:2)

这假设您已经在其他地方验证了fqdn的内容(例如:破折号允许,没有下划线或其他非字母数字字符),并且尽可能自由。

'(?:(?<hostname>.+)\.)?(?<domainname>[^.]+\.[^.]+?)(?:\:(?<port>[^:]+))?$'

匹配主机名组件(如果存在)(包括多个其他级别):

bar.foo.example.com:8000将匹配:

  • 主机名:bar.foo(可选)
  • domainname:example.com
  • 端口:8000(可选)

答案 2 :(得分:1)

我不熟悉VB.NET或ASP,但关于正则表达式的主题......

  • 首先,您需要使用^$锚定您的表达。
  • 接下来,\w可能会根据实现,区域设置等匹配不同的内容,因此您可能希望明确。例如,\w可能与连字符(域名中的有效字符)不匹配。
  • 您似乎没有考虑可选的端口号。

我确信那里有一个更准确的RFC表达式,但这是一个适合你的事情的开始。

^([a-z0-9\-]+\.)*([a-z0-9\-]+\.[a-z0-9\-]+)(:[0-9]+)?$

细分:

([a-z0-9\-]+\.)*:从零个或多个主机名开始......
([a-z0-9\-]+\.[a-z0-9\-]+):后跟两个主机名......
(:[0-9]+)?:后跟可选的端口声明。

请注意,如果您要处理example.ne.jp这样的域名,则只会获得.ne.jp。另请注意,上面的示例表达式应该不区分大小写。