谁有一个正则表达式,可以匹配任何合法的DNS主机名或IP地址?
编写一个95%的工作时间很容易,但我希望得到一个经过良好测试的东西,完全匹配DNS主机名的最新RFC规范。
谁有一个正则表达式,可以匹配任何合法的DNS主机名或IP地址?
编写一个95%的工作时间很容易,但我希望得到一个经过良好测试的东西,完全匹配DNS主机名的最新RFC规范。
当前回答
新的网络框架为结构IPv4Address和结构IPv6Address提供了可失败的初始化器,可以很容易地处理IP地址部分。在IPv6中使用regex实现这一点很困难,因为所有的缩短规则。
不幸的是,对于主机名,我没有一个优雅的答案。
注意,网络框架是最近的,所以它可能会强迫你编译最新的操作系统版本。
import Network
let tests = ["192.168.4.4","fkjhwojfw","192.168.4.4.4","2620:3","2620::33"]
for test in tests {
if let _ = IPv4Address(test) {
debugPrint("\(test) is valid ipv4 address")
} else if let _ = IPv6Address(test) {
debugPrint("\(test) is valid ipv6 address")
} else {
debugPrint("\(test) is not a valid IP address")
}
}
output:
"192.168.4.4 is valid ipv4 address"
"fkjhwojfw is not a valid IP address"
"192.168.4.4.4 is not a valid IP address"
"2620:3 is not a valid IP address"
"2620::33 is valid ipv6 address"
其他回答
您可以单独使用下列正则表达式,也可以将它们组合在一个联合或表达式中使用。
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])$";
valididpaddressregex匹配有效的IP地址,ValidHostnameRegex匹配有效的主机名。根据您使用的语言,\可能必须用\进行转义。
ValidHostnameRegex根据RFC 1123有效。最初,RFC 952规定主机名段不能以数字开头。
http://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])$";
要匹配一个有效的IP地址,使用以下正则表达式:
(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}
而不是:
([01]?[0-9][0-9]?|2[0-4][0-9]|25[0-5])(\.([01]?[0-9][0-9]?|2[0-4][0-9]|25[0-5])){3}
解释
许多正则表达式引擎匹配OR序列中的第一种可能性。例如,试试下面的正则表达式:
10.48.0.200
Test
测试好与坏的区别
我发现这对于IP地址来说非常有效。它像上面的答案一样进行验证,但它也确保ip是隔离的,因此在ip之后或之前没有文本或更多的数字/小数。
(? < ! \ S)(吗? (?:\ d | (1 - 9) \ d | 1 \ \ d | 2 (0 - 4) \ d | 25 (0 - 5)) \ b |。\ b) {7} (? ! \ S)
AddressRegex = "^(ftp|http|https):\/\/([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}:[0-9]{1,5})$";
HostnameRegex = /^(ftp|http|https):\/\/([a-z0-9]+\.)?[a-z0-9][a-z0-9-]*((\.[a-z]{2,6})|(\.[a-z]{2,6})(\.[a-z]{2,6}))$/i
这些re仅用于此类型验证
只在以下情况下工作 http://www.kk.com http://www.kk.co.in
不适合
http://www.kk.com/ http://www.kk.co.in.kk
http://www.kk.com/dfas http://www.kk.co.in/
"^((\\d{1,2}|1\\d{2}|2[0-4]\\d|25[0-5])\.){3}(\\d{1,2}|1\\d{2}|2[0-4]\\d|25[0-5])$"