主机名正则表达式

Can*_*ith 28 regex

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

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

但它允许连续超时和超过255个字符的主机名.如果完美的正则表达式是不可能的,那就这么说吧.

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

Can*_*ith 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])?)*\.?$

  • 我知道它只是语义,但这个正则表达式验证了FQDN,*不是*主机名. (7认同)
  • 它不接受具有尾随"."的域.但除此之外,有效. (2认同)
  • 这匹配只有数字的名称无效(参见RFC 1912:`标签可能不是所有数字,但可能有一个前导数字') (2认同)

der*_*ekm 7

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

规格:

<hname> ::= <name>*["."<name>]
<name> ::= <letter-or-digit>[*[<letter-or-digit-or-hyphen>]<letter-or-digit>]
Run Code Online (Sandbox Code Playgroud)

正则表达式:

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

我自己测试了不少排列,我认为这是准确的.

此正则表达式也不进行长度验证.RFC要求对点和名称之间的标签进行长度限制,但是通过检查完整字符串长度并通过拆分".",可以在验证此正则表达式后,通过第二次和第三次传递轻松检查长度.并验证所有子串长度.例如,在JavaScript中,标签长度验证可能如下所示:example..com.


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

"example.com".split(".").reduce(function (prev, curr) { return prev && curr.length <= 63; }, true)

  • 我无法使用否定的lookbehind(感谢JS),所以我想出了这个非常相似的:`^([a-zA-Z0-9]+(-[a-zA-Z0-9]+)*) +(\.([a-zA-Z0-9]+(-[a-zA-Z0-9]+)*))*$` - 同样,它不检查长度,但它*确实*验证没有前导/ 尾随/重复 `-` 或 `.`。适用于裸主机名或 FQDN。 (3认同)