【问题标题】:what could be the best regex for domain validation? [closed]什么是域验证的最佳正则表达式? [关闭]
【发布时间】:2013-03-16 12:31:13
【问题描述】:

我需要验证以下域,例如 starbucks.com、apple.com、microsoft.com。 大多数给定的正则表达式都无法正常工作。对于我的情况,什么是域验证的最佳正则表达式?

非常感谢您提前提供的帮助!

【问题讨论】:

  • 不具建设性 - 您应该自己尝试一下:因为显然并非所有“给定正则表达式”都工作不正确,您只需获得所有工作正常的内容,然后选择您最喜欢的一个。跨度>
  • ping 它,看看你是否得到答案(或至少一个 IP 地址)?
  • 请查看任何显示 Uri 类用法的问题(如 stackoverflow.com/questions/15641797/…),因为它比您能想出的任何疯狂的正则表达式都要好得多。
  • 大厅监视器再次响起。这是另一个我觉得很有用的问题,在这里你向大家展示了你有多聪明。

标签: c# regex validation


【解决方案1】:

免责声明:请注意,定义“有效域”的规则构成移动目标。下面的答案仅处理“老派”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 主机名:(请注意,这包含了对子域的上述表达式的修改版本,并且还添加了 cmets )。

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 - 它只允许任何两个字母。它也没有列出以下各种 TLD:XN--XXXXX 品种。此解决方案也不考虑尚未完全实施且普遍可接受的国际域名。

有关验证其他 URI 组件的更多信息,您可能需要查看我不久前写的一篇文章:Regular Expression URI Validation。它为RFC3986 定义的所有各种URI 组件提供各种语言的代码sn-ps。

快乐的正则表达式!

【讨论】:

  • 非常感谢您的帮助。这对我很有用:)
【解决方案2】:
^(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

等等……

【讨论】:

  • [url="happens.com/when/I/do"]some fake markup[/url]? 似乎匹配 'happens.com/when/I/do"]some fake markup[/url]?'第二组
  • 匹配匹配 = Regex.Match(domain.Text,"^(http|https):\/\/|[a-z0-9]+([\-\.]{1} [a-z0-9]+)*\.[az]{2,6}(:[0-9]{1,5})?(\/.*)?$/ix", RegexOptions.IgnoreCase) ;当我使用上述语法时,我收到“无法识别的转义序列”错误。你能帮忙吗?
  • 尝试匹配 match = Regex.Match(domain.text,@"^(http|https):\/\/|[a-z0-9]+([\-\.]{ 1}[a-z0-9]+)*\.[a-z‌​]{2,6}(:[0-9]{1,5})?(\/.*)?$/ix" , 正则表达式选项.IgnoreCase);即在正则表达式字符串前面加上 @ - 这个 @ 字符使您不必转义字符串中的所有 \ 字符
  • 是的,正如简所说 - 添加“@”会将其视为文字字符串。你可以在这里找到更多信息:msdn.microsoft.com/en-us/library/aa691090(v=vs.71).aspx
  • 谢谢简。但我仍然得到 match.Success 对于我的输入 starbucks.com Match match = Regex.Match(domain.Text, @"^(http|https):\/\/|[a-z0-9]+( [\-\.]{1}[a-z0-9]+)*\.[a-‌​z‌​]{2,6}(:[0-9]{1,5})?(\ /.*)?$/ix", RegexOptions.IgnoreCase);
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-09
  • 1970-01-01
  • 2017-01-22
  • 2020-02-09
  • 2021-12-11
  • 2014-05-01
相关资源
最近更新 更多