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

Sel*_*mar -6 c# regex validation

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

非常感谢您的帮助!

rid*_*ner 11

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

DNS命名主机验证

根据相关的互联网建议(RFC3986第2.2节,反过来又指:RFC1034第3.5节RFC1123第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.
} 
Run Code Online (Sandbox Code Playgroud)

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

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

快乐regexing!