主机名正则表达式

时间:2009-09-13 18:06:02

标签: regex

我正在寻找 正则表达式来验证主机名。它必须完全符合标准。现在,我有

^[0-9a-z]([0-9a-z\-]{0,61}[0-9a-z])?(\.[0-9a-z](0-9a-z\-]{0,61}[0-9a-z])?)*$

但它允许连续超时和超过255个字符的主机名。如果完美的正则表达式是不可能的,请说明。

编辑/澄清:Google搜索没有透露这是一个已解决(或经证实无法解决)的问题。我想创建最终的正则表达式,以便没有人必须自己编写自己的。如果方言很重要,我想要为每个方言做一个版本。

5 个答案:

答案 0 :(得分:27)

^(?=.{1,255}$)[0-9A-Za-z](?:(?:[0-9A-Za-z]|-){0,61}[0-9A-Za-z])?(?:\.[0-9A-Za-z](?:(?:[0-9A-Za-z]|-){0,61}[0-9A-Za-z])?)*\.?$

答案 1 :(得分:7)

批准的答案会验证包含多个点的无效主机名(例如.com)。这是我提出的正则表达式,我认为完全匹配RFC要求允许的内容(减去某些解析器支持的结尾“。”以短路相对命名和强制FQDN解析)。

规格:

<hname> ::= <name>*["."<name>]
<name> ::= <letter-or-digit>[*[<letter-or-digit-or-hyphen>]<letter-or-digit>]

正则表达式:

^([a-zA-Z0-9](?:(?:[a-zA-Z0-9-]*|(?<!-)\.(?![-.]))*[a-zA-Z0-9]+)?)$

我自己测试了很多排列,我认为这是准确的。

此正则表达式也不进行长度验证。 RFC要求对点和名称之间的标签进行长度限制,但是通过检查完整字符串长度并通过拆分“。”,可以在验证此正则表达式后,通过第二次和第三次传递轻松检查长度。并验证所有子串长度。例如,在JavaScript中,标签长度验证可能如下所示:"example.com".split(".").reduce(function (prev, curr) { return prev && curr.length <= 63; }, true)


  

替代正则表达式(没有负面的背后,礼貌@thom_nic):

     

^([a-zA-Z0-9]+(-[a-zA-Z0-9]+)*)+(\.([a-zA-Z0-9]+(-[a-zA-Z0-9‌​]+)*))*$

答案 2 :(得分:4)

你的答案相对接近。

但请参阅

对于主机名RE,perl module生成

(?:(?:(?:(?:[a-zA-Z0-9][-a-zA-Z0-9]*)?[a-zA-Z0-9])[.])*(?:[a-zA-Z][-a-zA-Z0-9]*[a-zA-Z0-9]|[a-zA-Z])[.]?)

我会修改为更精确:

(?:(?:(?:(?:[a-zA-Z0-9][-a-zA-Z0-9]{0,61})?[a-zA-Z0-9])[.])*(?:[a-zA-Z][-a-zA-Z0-9]{0,61}[a-zA-Z0-9]|[a-zA-Z])[.]?)

可选择使用^$将结尾锚定到仅匹配主机名。

我不认为单个RE可以完成完整的验证,因为根据Wikipedia,有一个255个字符长度的限制,我认为不能包含在同一个RE内,至少不会没有大量的更改,但在运行RE之前只需检查长度&lt; = 255就足够了。

答案 3 :(得分:1)

看一下以下问题。一些答案具有主机名的正则表达式

您能指定要使用此正则表达式的语言吗?大多数语言/系统都具有略微不同的正则表达式实现,这将影响人们的答案。

答案 4 :(得分:0)

怎么样:

^(?=.{1,255})([0-9A-Za-z]|_{1}|\*{1}$)(?:(?:[0-9A-Za-z]|\b-){0,61}[0-9A-Za-z])?(?:\.[0-9A-Za-z](?:(?:[0-9A-Za-z]|\b-){0,61}[0-9A-Za-z])?)*\.?$

仅在开头只匹配一个'_'(对于某些SRV)而且只有一个*(如果是DN通配符的标签)