有没有一个正则表达式能匹配任何合法的DNS主机名或IP地址?
编写一个能够在95%的情况下工作的正则表达式很容易,但我希望得到一个经过充分测试以精确匹配最新RFC规范的DNS主机名的表达式。
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"
/^(?:[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])?$/
试一下这个:
((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)
在我的情况下它有效。
这是一个正则表达式,我在Ant中使用它来从ANT_OPTS中获取代理主机IP或主机名。这是用于获取代理IP以便在为分叉的JVM配置代理之前运行Ant“isreachable”测试。
^.*-Dhttp\.proxyHost=(\w{1,}\.\w{1,}\.\w{1,}\.*\w{0,})\s.*$
\w
,它不会捕获IP,只会在某些情况下捕获主机名。 - Yaron我发现这对于IP地址非常有效。它像顶部答案一样进行验证,但它还确保IP被隔离,因此IP之后或之前没有文本或更多的数字/小数。
(?<!\S)(?:(?:\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\b|.\b){7}(?!\S)
这里还有一个缺失的微妙之处。
确实,HOSTNAME应该基本上与上面给出的匹配。
缺失的是,对主机名的引用可以相同,加上可选的句点。
例如,使用尾随句点,ping foo.bar.svc.cluster.local.
将仅ping该主机名,并且不会尝试在resolv.conf中进行任何DNS搜索选项。
tldr-如果您提供一个输入框来接收主机名,则输入的内容实际上不需要是有效的主机名。
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
不适用于
grep -E '(^|[^[:alnum:]+)(([0-1]?[0-9]{1,2}|2[0-4][0-9]|25[0-5])\.){3}([0-1]?[0-9]{1,2}|2[0-4][0-9]|25[0-5])([^[:alnum:]]|$)'
不幸的是,验证八位字节的正则表达式部分在许多提供的解决方案中都是重复的。虽然这比模式实例更好,但如果正则表达式支持子程序,则可以完全消除重复。下一个示例使用grep
的-P
开关启用这些功能,并利用前瞻和后顾功能。(我选择的函数名是'o'表示八位字节。我本可以使用'octet'作为名称,但想要简洁明了。)
grep -P '(?<![\d\w\.])(?<o>([0-1]?[0-9]{1,2}|2[0-4][0-9]|25[0-5]))(\.\g<o>){3}(?![\d\w\.])'
如果IP地址在以句子形式呈现的文本文件中,处理点可能会导致错误的负面结果,因为句号可能跟在点分表示法之后而不是作为其中一部分。以下是上述变体的修复方法:
grep -P '(?<![\d\w\.])(?<x>([0-1]?[0-9]{1,2}|2[0-4][0-9]|25[0-5]))(\.\g<x>){3}(?!([\d\w]|\.\d))'
filter_var(gethostbyname($dns), FILTER_VALIDATE_IP) == true ? 'ip' : 'not ip'
这个怎么样?
([0-9]{1,3}\.){3}[0-9]{1,3}