谁有一个正则表达式,可以匹配任何合法的DNS主机名或IP地址?
编写一个95%的工作时间很容易,但我希望得到一个经过良好测试的东西,完全匹配DNS主机名的最新RFC规范。
谁有一个正则表达式,可以匹配任何合法的DNS主机名或IP地址?
编写一个95%的工作时间很容易,但我希望得到一个经过良好测试的东西,完全匹配DNS主机名的最新RFC规范。
当前回答
我考虑过这个简单的正则表达式匹配模式来进行IP地址匹配 \ d + [] \ d + [] \ d + [] \ d +
其他回答
新的网络框架为结构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"
def isValidHostname(hostname):
if len(hostname) > 255:
return False
if hostname[-1:] == ".":
hostname = hostname[:-1] # strip exactly one dot from the right,
# if present
allowed = re.compile("(?!-)[A-Z\d-]{1,63}(?<!-)$", re.IGNORECASE)
return all(allowed.match(x) for x in hostname.split("."))
下面是我在Ant中用于从ANT_OPTS中获取代理主机IP或主机名的正则表达式。这用于获取代理IP,以便在为fork JVM配置代理之前运行Ant“isreachable”测试。
^.*-Dhttp\.proxyHost=(\w{1,}\.\w{1,}\.\w{1,}\.*\w{0,})\s.*$
要匹配一个有效的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)