匹配DNS主机名或IP地址的正则表达式?
匹配DNS主机名或IP地址的正则表达式?
有人有一个正则表达式可以匹配任何合法的DNS主机名或IP地址吗?
编写一个可以95%起效的正则表达式很容易,但我希望得到一个经过充分测试、完全符合DNS主机名的最新RFC规范的表达式。
admin 更改状态以发布 2023年5月24日
smink的主机名正则表达式没有遵守主机名中各标签长度限制。每个有效主机名中的标签长度不应超过63个八位字节。
ValidHostnameRegex="^([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])\ (\.([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]{0,61}[a-zA-Z0-9]))*$"
请注意,第一行末尾的反斜杠是Unix shell语法,用于换行。它不是正则表达式的一部分。
这里仅给出正则表达式本身的单行形式:
^([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])(\.([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]{0,61}[a-zA-Z0-9]))*$
您还应分别检查主机名的总长度不应超过255个字符。更多信息,请参考RFC-952和RFC-1123。
您可以单独使用以下正则表达式,也可以将它们组合在一起使用,作为一个OR表达式。
ValidIpAddressRegex = "^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$"; ValidHostnameRegex = "^(([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]*[a-zA-Z0-9])\.)*([A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9\-]*[A-Za-z0-9])$";
ValidIpAddressRegex 匹配有效的IP地址,而 ValidHostnameRegex 则匹配有效的主机名。取决于您使用的语言,\可能需要用\进行转义。
ValidHostnameRegex 按照 RFC 1123 中的指定是有效的主机名。最初,RFC 952 规定了主机名段不能以数字开头。
https://en.wikipedia.org/wiki/Hostname
最初的主机名规范在RFC 952中指定,规定标签不能以数字或连字符开头,且不能以连字符结尾。 然而,后来的规范(RFC 1123)允许主机名标签以数字开头。
Valid952HostnameRegex = "^(([a-zA-Z]|[a-zA-Z][a-zA-Z0-9\-]*[a-zA-Z0-9])\.)*([A-Za-z]|[A-Za-z][A-Za-z0-9\-]*[A-Za-z0-9])$";