什么可能是域验证的最佳正则表达式?

时间:2013-03-26 16:00:53

标签: c# regex validation

我有一个情况来验证以下域名,如starbucks.com,apple.com,microsoft.com。 大多数给定的正则表达式都不能正常工作。对于我的情况,什么可能是域验证的最佳正则表达式?

非常感谢您的帮助!

2 个答案:

答案 0 :(得分:11)

免责声明:请注意,定义“有效域”的规则构成移动目标。以下答案仅涉及“旧学校”DNS规则(仅使用ASCII字符),并不试图处理国际域(如RFC3490中所述)。另请注意,很快会出现大量新的顶级域名(TLD),因此需要定期更新以下解决方案(请参阅:IANA.ORG了解当前有效TLD列表)。

DNS命名主机验证

根据相关的互联网建议(RFC3986 section 2.2,后者又指:RFC1034 section 3.5RFC1123 section 2.1),子域名(DNS域名主机名的一部分),必须满足几个要求:

子域

  • 每个子域名部分的长度不得超过63。
  • 每个子域名部分必须以字母数字开头和结尾(即字母[A-Za-z]或数字[0-9])。
  • 每个子域名部分可能包含连字符(破折号),但不能以连字符开头或结尾。

这是满足这些要求的子域部分的表达式片段:

(?:[A-Za-z0-9][A-Za-z0-9\-]{0,61}[A-Za-z0-9]|[A-Za-z0-9])

请注意,此表达式需要一个具有两个备选项的组来处理仅具有一个字符的子域的特殊情况。此外,不应单独使用此表达式片段 - 它需要在更大的上下文中并入边界条件,如下面的DNS主机名表达式所示...

DNS主机名

命名主机(不是IP地址)必须满足其他要求:

  • 主机名可能包含多个子域部分,每个部分用一个点分隔。
  • 整个主机名的长度不应超过255个字符。
  • 顶级域名(DNS主机名的最右侧部分)必须是国际公认的值之一。有效顶级域名列表由IANA.ORG维护。 (请参阅此处的简要当前列表:http://data.iana.org/TLD/tlds-alpha-by-domain.txt)。

考虑到这一点,这里有一个注释的正则表达式(在C#语法中),它将伪验证DNS主机名:(注意,这包含了子域的上述表达式的修改版本,并为此添加了注释)。

if (Regex.IsMatch(text, @" # Rev:2013-03-26
    # Match DNS host domain having one or more subdomains.
    # Top level domain subset taken from IANA.ORG. See:
    # http://data.iana.org/TLD/tlds-alpha-by-domain.txt
    ^                  # Anchor to start of string.
    (?!.{256})         # Whole domain must be 255 or less.
    (?:                # Group for one or more sub-domains.
      [a-z0-9]         # Either subdomain length from 2-63.
      [a-z0-9-]{0,61}  # Middle part may have dashes.
      [a-z0-9]         # Starts and ends with alphanum.
      \.               # Dot separates subdomains.
    | [a-z0-9]         # or subdomain length == 1 char.
      \.               # Dot separates subdomains.
    )+                 # One or more sub-domains.
    (?:                # Top level domain alternatives.
      [a-z]{2}         # Either any 2 char country code,
    | AERO|ARPA|ASIA|BIZ|CAT|COM|COOP|EDU|  # or TLD 
      GOV|INFO|INT|JOBS|MIL|MOBI|MUSEUM|    # from list.
      NAME|NET|ORG|POST|PRO|TEL|TRAVEL|XXX  # IANA.ORG
    )                  # End group of TLD alternatives.
    $                  # Anchor to end of string.",
    RegexOptions.IgnoreCase | RegexOptions.IgnorePatternWhitespace))
{
    // Valid named DNS host (domain).
} else {
    // NOT a valid named DNS host.
} 

请注意,此表达式并不完美。它需要一个或多个子域,但从技术上讲,主机可以包含没有子域的TLD(但这种情况很少见)。它也没有明确说明每两个字符国家代码TLD - 它只允许任何两个字母。它也没有列出XN--XXXXX种类的各种TLD。此解决方案也不考虑尚未完全实现且普遍接受的国际域名。

有关验证其他URI组件的更多信息,您可能需要查看我之前写过的文章:Regular Expression URI Validation。它为RFC3986定义的所有各种URI组件提供了各种语言的代码片段。

快乐的复兴!

答案 1 :(得分:1)

^(http|https):\/\/|[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,6}(:[0-9]{1,5})?(\/.*)?$/ix

这将接受:

apple.com

http://apple.com

http://www.apple.com

依旧......