寻找主机名/机器名验证的正则表达式/代码

Posted

技术标签:

【中文标题】寻找主机名/机器名验证的正则表达式/代码【英文标题】:Looking for regex/code for hostname/machine name validation 【发布时间】:2011-06-06 10:02:30 【问题描述】:

寻找主机名验证正则表达式。

Regular expression to match DNS hostname or IP Address?

在那个链接中,先生们提出了一个不错的正则表达式。我对此有一些问题/疑问:

在 windows 计算机/网络名称上 像1abcd 是允许的(验证在 我们的本地网络) 在建议的正则表达式中,点可能只出现一次。我假设 abc.def.gh 是一个有效的主机名 不是吗。

奇怪,但也找不到任何可以验证主机名字符串的 .NET 类(是这种情况吗?)。任何建议将不胜感激。

更新:对于任何类/方法提案 - 请提供适用于 .NET/C# 和 SilverLight 的建议。

【问题讨论】:

【参考方案1】:

在建议的正则表达式中,点可能 只出现一次。我会假设 abc.def.gh 是一个有效的主机名 好吧,不是吗。

圆点可能出现不止一次。测试正则表达式here,你会看到它匹配。

正则表达式的相关片段(第一部分是):

([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]*[a-zA-Z0-9])\.)*

在 Windows 计算机/网络名称上 像 1abcd 是允许的(验证于 我们的本地网络)

来自wikipedia:

原始规格 RFC 952 中的主机名,强制要求 标签不能以数字开头或 带有连字符,并且不能以 a 结尾 连字符。然而,随后的 规范 (RFC 1123) 允许 主机名标签以数字开头。

我提到了RFC 952。我将尝试更新主机名的正则表达式以符合RFC 1123。

【讨论】:

另一件需要考虑的事情是,段的长度不能超过 63 个字符,并且整个主机名的长度不能超过 253 个字符。【参考方案2】:

Uri.CheckHostName 是一种可以帮助您的方法吗? 如果主机名无法识别,结果将是"Unknown"。

【讨论】:

直到今天早上,那个方法名称对我来说看起来很有希望。但是,像“9999999”这样的名称通过(应该吗?)。像“1.3”这样的名字也会通过(他们应该吗?)。 根据我对wikipedia的理解,这似乎是有效的主机名 该方法在 Silverlight 中不起作用,代码也应该服务于 SL 平台。 我会在 Silverlight 中看到 Dns.GetHostEntry(但从不使用)。如果它不是有效的主机名,它会解析主机名并启动 ArgumentException。右边还有另一个问题validate hostname string in Python,这个正则表达式 "(?!-)[A-Z\d-]1,63(? 【参考方案3】:

(?i)(?=.5,20$)^(([a-z\d]|[a-z\d][a-z\d\-]*[a-z\d])\.)*([a-z\d]|[a-z\d][a-z\d\-]*[a-z\d])$

解释:

(?i) - 忽略大小写

(?=.5,20$) - 将字符串长度限制在 5 到 20 个字符内。

^(([a-z\d]|[a-z\d][a-z\d\-]*[a-z\d])\.)*([a-z\d]|[a-z\d][a-z\d\-]*[a-z\d])$ - 接受任何字母和数字以及连字符和点

【讨论】:

以上是关于寻找主机名/机器名验证的正则表达式/代码的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式验证邮箱格式是啥?

从代码行中删除变量名(JS 中的伪代码)

django 的form组件(验证原理的流程)--2

xslt正则表达式

JS的常用正则表达式 验证密码用户名等

JS的常用正则表达式 验证密码用户名等