我正在寻找 正则表达式来验证主机名。它必须完全符合标准。现在,我有
^[0-9a-z]([0-9a-z\-]{0,61}[0-9a-z])?(\.[0-9a-z](0-9a-z\-]{0,61}[0-9a-z])?)*$
但它允许连续超时和超过255个字符的主机名。如果完美的正则表达式是不可能的,请说明。
编辑/澄清:Google搜索没有透露这是一个已解决(或经证实无法解决)的问题。我想创建最终的正则表达式,以便没有人必须自己编写自己的。如果方言很重要,我想要为每个方言做一个版本。
答案 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通配符的标签)