C# 域验证的最佳正则表达式是什么?

C# 域验证的最佳正则表达式是什么?,c#,regex,validation,C#,Regex,Validation,我需要验证以下域名,如starbucks.com、apple.com、microsoft.com。 大多数给定的正则表达式都不能正常工作。对于我的情况,什么是域验证的最佳正则表达式 非常感谢您的帮助 ^(http|https):\/\/|[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,6}(:[0-9]{1,5})?(\/.*)?$/ix 这将接受: 苹果网 等等……免责声明:请注意,定义“有效域”的规则构成了一个移动目标。下面的答案只涉及“老派”DNS规则

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

非常感谢您的帮助

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

苹果网


等等……

免责声明:请注意,定义“有效域”的规则构成了一个移动目标。下面的答案只涉及“老派”DNS规则(仅使用ASCII字符),不尝试处理国际域(如中所述)。还要注意的是,很快会出现大量新的顶级域(TLD),因此需要定期更新下面的解决方案(请参阅:以获取当前有效TLD列表)

DNS命名主机验证 根据相关互联网建议(,反过来指:和),子域(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维护。(请参见此处的当前裸骨列表:)
考虑到这一点,这里有一个带注释的正则表达式(用C#语法),它将伪验证DNS主机名:(注意,它包含了子域的上述表达式的修改版本,并将注释添加到该表达式中)

if(Regex.IsMatch)(文本,@“#版本:2013-03-26
#匹配具有一个或多个子域的DNS主机域。
#顶级域子集取自IANA.ORG。请参阅:
# http://data.iana.org/TLD/tlds-alpha-by-domain.txt
^#锚定至管柱起点。
(?!.{256})#整个域必须小于等于255。
(?:#一个或多个子域的组。
[a-z0-9]#2-63的任一子域长度。
[a-z0-9-]{0,61}#中间部分可能有破折号。
[a-z0-9]#以alphanum开始和结束。
\.#点分隔子域。
|[a-z0-9]#或子域长度==1个字符。
\.#点分隔子域。
)+#一个或多个子域。
(?:#顶级域备选方案。
[a-z]{2}#任意2字符国家代码,
|航空| ARPA |亚洲|商业| CAT | COM | COOP | EDU |或TLD
从列表中选择GOV | INFO | INT | JOBS | MIL | MOBI | MUSEUM |。
NAME | NET | ORG | POST | PRO | TEL | TRAVEL | XXX | IANA.ORG
)#TLD备选方案的终端组。
$#锚定到字符串的末尾。“,
RegexOptions.IgnoreCase | RegexOptions.ignorepattern空白)
{
//有效的命名DNS主机(域)。
}否则{
//不是有效的命名DNS主机。
} 
请注意,这个表达式并不完美。它需要一个或多个子域,但从技术上讲,主机可以由没有子域的TLD组成(但这种情况很少见)。它也没有明确说明每个两个字符的国家代码TLD-它只允许任何两个字母。它也没有列出:
XN--XXXXX
品种的各种TLD。这个解决方案也没有考虑尚未完全实施和普遍接受的国际域名。 有关验证其他URI组件的更多信息,请参阅我不久前写的一篇文章:。它为所定义的所有各种URI组件提供各种语言的代码段


祝你快乐

不是建设性的-你应该自己尝试一下:因为显然不是所有的“给定正则表达式”都工作不正常,所以你只需一次获得所有工作正常的正则表达式,然后选择一个你最喜欢的。点击它,看看你是否得到了答案(或者至少是一个ip地址)?请查看任何显示Uri类用法的问题(如)因为它比你能想到的任何疯狂的正则表达式都要好得多。大厅监视器再次罢工。这是我发现的另一个有用的问题,在这里你向大家展示了你有多聪明。[url=“fake markup[/url]?似乎匹配”accounts.com/when/i/do“]在第二个groupMatch match=Regex.match(domain.Text,“^(http | https):\/\/\[a-z0-9]+([\-\-\.[a-z0-9]+])*。[[a-z0-9]+]2,6}(:[0-9]{1,5])(\/.*.],RegexOptions.IgnoreCase);当我使用上述语法时,我得到了“无法识别的转义序列”错误。你能帮忙吗?试试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);也就是说,在正则表达式字符串前面加上@这个@字符可以避免转义字符串中的所有\字符。是的,正如Jane所说,添加@将把它当作一个文本字符串