首页 > 试题广场 >

验证IP地址

[编程题]验证IP地址
  • 热度指数:107366 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
编写一个函数来验证输入的字符串是否是有效的 IPv4 或 IPv6 地址

IPv4 地址由十进制数和点来表示,每个地址包含4个十进制数,其范围为 0 - 255, 用(".")分割。比如,172.16.254.1;
同时,IPv4 地址内的数不会以 0 开头。比如,地址 172.16.254.01 是不合法的。

IPv6 地址由8组16进制的数字来表示,每组表示 16 比特。这些组数字通过 (":")分割。比如,  2001:0db8:85a3:0000:0000:8a2e:0370:7334 是一个有效的地址。而且,我们可以加入一些以 0 开头的数字,字母可以使用大写,也可以是小写。所以, 2001:db8:85a3:0:0:8A2E:0370:7334 也是一个有效的 IPv6 address地址 (即,忽略 0 开头,忽略大小写)。

然而,我们不能因为某个组的值为 0,而使用一个空的组,以至于出现 (::) 的情况。 比如, 2001:0db8:85a3::8A2E:0370:7334 是无效的 IPv6 地址。
同时,在 IPv6 地址中,多余的 0 也是不被允许的。比如, 02001:0db8:85a3:0000:0000:8a2e:0370:7334 是无效的。

说明: 你可以认为给定的字符串里没有空格或者其他特殊字符。

数据范围:字符串长度满足 5 \leq n \leq 50
进阶:空间复杂度 ,时间复杂度
示例1

输入

"172.16.254.1"

输出

"IPv4"

说明

这是一个有效的 IPv4 地址, 所以返回 "IPv4" 
示例2

输入

"2001:0db8:85a3:0:0:8A2E:0370:7334"

输出

"IPv6"

说明

这是一个有效的 IPv6 地址, 所以返回 "IPv6" 
示例3

输入

"256.256.256.256"

输出

"Neither"

说明

这个地址既不是 IPv4 也不是 IPv6 地址 

备注:
ip地址的类型,可能为
IPv4,   IPv6,   Neither
class Solution:
    def solve(self , IP: str) -> str:
        # write code here
        try:
            assert len([i for i in IP.split('.') if 0 <= int(i) <= 255 and not (i.startswith('0') and len(i)>1)]) == 4
        except:
            try:
                assert len([i for i in IP.split(':') if len(i) <= 4 and 0 <= int(i, 16) <= 65535]) == 8
            except:
                return 'Neither'
            else:
                return 'IPv6'
        else:
            return 'IPv4'

发表于 2024-09-08 18:15:51 回复(1)
class Solution:
    def solve(self , IP: str) -> str:
        # write code here
        if '.' in IP:
            #try用于判断有无空元素,如123.2.3. 的3后面一个元素为空,不能执行int,程序会选择except输出
            try:
                #以‘.’为分割化为数值列表,方便取值范围判断
                v4=list(map(int,IP.split('.')))
                #将数值列表重新化为字符串来判断是否有0开头,注意join只能针对str,需要将int转为str
                if '.'.join(str(item) for item in v4)==IP and max(v4)<=255 and min(v4)>=0:
                    return 'IPv4'
                else:return 'Neither'
            except:return 'Neither'
        elif ':' in IP:
            v6=IP.split(':')
            try:
                for i in v6:
                    #试执行将16进制转为10进制,如超出范围,程序会选择except输出
                    it=int(i,16)
                    #判断有无多余零以及空元素的情况
                    if len(i)>4 or len(i)==0:
                        return 'Neither'
                else:return 'IPv6'
            except:return 'Neither'
发表于 2024-04-10 09:19:28 回复(0)
class Solution:
    def solve(self , IP: str) -> str:
        # write code here
        if '.' in IP:
            i4 = []
            ipv4_ls = IP.split('.')
            for i in ipv4_ls:
                try:
                    a = int(i)
                except:
                    return "Neither"
                if len(i)>1 and i[0]!='0':
                    if int(i)<256:
                        i4.append('1')
                    else:
                        i4.append('0')
                elif i[0]=='0' or i=='':
               
                    return "Neither"
                else:
                    i4.append('1')
            if i4.count('1')==4:
                return 'IPv4'
            if i4.count('1')!=4:
                return "Neither"

        else:
            ipv6_ls = IP.split(':')
            if len(ipv6_ls) != 8:
                return "Neither"
            ip6 = []
            for o in ipv6_ls:
                for p in o:
                    if ord(p.lower()) > ord('f'):
                        return "Neither"
                if len(o)>4 or o=='':
                    ip6.append('0')
                else:
                    ip6.append('1')
            if ip6.count('1')==8:
                return "IPv6"
            else:
                return "Neither"

编辑于 2024-02-21 21:03:50 回复(0)
class Solution:
    def solve(self , IP: str) -> str:
        # write code here
        # Possible IPv4
        ret = "Neither"

        if '.' in IP:
            address = list(IP.split('.'))
            if len(address) != 4:
                return ret

            ret = "IPv4"
            for i in address:
                if len(i) <= 0:
                    ret = "Neither"
                    break
                try:
                    a = int(i)
                except:
                    ret = "Neither"
                    break
                # 值相当但长度不等,说明有前缀的0
                if len(str(a)) != len(i):
                    ret = "Neither"
                    break
                # 字段值不合法
                if int(i) < 0&nbs***bsp;int(i) >= 256:
                    ret = "Neither"
                    break
        else:
            address = list(IP.split(':'))
            if len(address) != 8:
                return ret

            ret = "IPv6"
            for i in address:
                if ret == "Neither":
                    break
                # 每一段的长度不合法
                if len(i) > 4&nbs***bsp;len(i) <= 0:
                    ret = "Neither"
                    break
                # 有不是16进制的字符
                for c in i:
                    print(c)
                    if ord(c.lower()) > ord('f'):
                        print("here")
                        ret = "Neither"
                        break
        return ret
笨办法穷举可能不合法的情况。测试用例里的特殊坑可能有:
- 像IPv4:某一段是空(有3个点号但只给了3个数值);有字母
- 像IPv6:有不属于16进制范围内使用的字符(A~F)
编辑于 2024-01-21 23:48:38 回复(0)
class Solution:
    def solve(self , IP: str) -> str:
        # write code here
        IP4 = 'IPv4'
        IP6 = 'IPv6'
        FIP = 'Neither'
        IPlist = IP.split('.')
        flagIP4 = True
        if len(IPlist) == 1:
            flagIP4 = False
            IPlist = IP.split(':')
        # 判断ipv4的逻辑
        if flagIP4:
            if len(IPlist) != 4:
                return FIP
            for str1 in IPlist:
                # 有其它字符直接返回FIP
                try:
                    num = int(str1)
                except ValueError:
                    return FIP
                # 排除类似0234
                if num >= 256&nbs***bsp;len(str1) > 3:
                    return FIP
                if str1[0] == '0' and num != 0:  # str1[0]也是‘0’而不是 0
                    print(str1[0])
                    return FIP
            return IP4
        # 判断ipv6的逻辑
        else:
            if len(IPlist) != 8:
                return FIP
            for str1 in IPlist:
                if str1 == '':
                    return FIP
                if len(str1) > 4:
                    return FIP
                for i, s in enumerate(str1):
                    if s not in ['0','1','2','3','4','5','6','7','8','9']:
                        s = s.lower()
                        if s not in ['a','b','c','d','e','f']:
                            return FIP
            return IP6

发表于 2023-08-17 17:26:30 回复(0)
#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
# 验证IP地址
# @param IP string字符串 一个IP地址字符串
# @return string字符串
#
class Solution:
    def solve(self , IP: str) -> str:
        # write code here
        if '.' in IP:
            arr =IP.split('.')
            if len(arr) >4:
                return "Neither"
            for i in range(len(arr)-1):
                if arr[i].isnumeric() ==False:
                    return "Neither"
                if int(arr[i]) > 255&nbs***bsp;arr[i][0] =='0':
                    return "Neither"
            return  "IPv4"

        if ":" in IP:
            arr = IP.split(':')
            if len(arr)>8:
                return "Neither"
            for i in range(len(arr)-1):
                if len(arr[i])>4&nbs***bsp;len(arr[i])<=0 :
                    return "Neither"
                for j in arr[i]:
                    if j.isnumeric() == False and (j>'f'&nbs***bsp;j<'A'&nbs***bsp;(j>'F' and j<'a')):
                        return "Neither"
            return "IPv6" 

发表于 2022-12-26 19:31:22 回复(0)
#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
# 验证IP地址
# @param IP string字符串 一个IP地址字符串
# @return string字符串
#
class Solution:
    def solve(self , IP: str) -> str:
        # write code here
        ip4 = []
        ip6 = []
        n4,n6 = float('-inf'),float('-inf')
        if '.' in IP:
            ip4 = IP.split('.')
            n4 = len(ip4)
        else:
            ip6 = IP.split(':')
            n6 = len(ip6)
        if n4>0 and n4 != 4:
            return 'Neither'
        elif n6>0 and n6!=8:
            return 'Neither'
        while n4>0:
            if ip4[n4-1]=='':
                return 'Neither'
            if ip4[n4-1][0]=='0':
                return 'Neither'
            for i in ip4[n4-1]:
                if i <'0'&nbs***bsp;i >'9':
                   return 'Neither' 
            if int(ip4[n4-1])>255&nbs***bsp;int(ip4[n4-1])<0:
                return 'Neither'
            n4 -= 1
        while n6>0:
            if len(ip6[n6-1])>4&nbs***bsp;len(ip6[n6-1])==0:
                return 'Neither'
            for i in ip6[n6-1]:
                if '9'>=i>='0'&nbs***bsp;'a'<=i<='f'&nbs***bsp;'A'<=i<='F':
                    continue
                else:
                    return 'Neither'
            n6 -= 1
        if n4 > n6:
            return "IPv4"
        else:
            return "IPv6"
            

发表于 2022-12-09 13:32:43 回复(0)
#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
# 验证IP地址
# @param IP string字符串 一个IP地址字符串
# @return string字符串
#
class Solution:
    def solve(selfIPstr) -> str:
        if "." in IP:
            arr = IP.split(".")
            a = 0
            for i in arr:
                try:
                    if len(arr) == 4 and 0 <= int(i) <= 255 and int(i[0]):
                        a += 1
                except:
                    return "Neither"
            if a == 4:
                return "IPv4"
            return "Neither"
        elif ":" in IP:
            arr = IP.split(":")
            a = 0
            for ip in arr:
                if (
                    ip == ""
                    or len(ip) > 4
                    or IP[-1] == ":"
                ):
                    return "Neither"
                try:
                    int(ip, 16)
                except:
                    return "Neither"
            return "IPv6"

发表于 2022-10-12 10:42:29 回复(0)
import re
class Solution:
    def solve(self , IP: str) -> str:
        # write code here
        res_ipv4 = re.compile("^((\d|[1-9]\d|1\d{2}|2[0-4]\d|25[0-5])\.){3}(\d|[1-9]\d|1\d{2}|2[0-4]\d|25[0-5])$").findall(IP)
        res_ipv6 = re.compile("^(((\d|a-f|A-F)|0[1-9|a-f|A-F]|[1-9|a-f|A-F][\d|a-f|A-F]|0[1-9|a-f|A-F][\d|a-f|A-F]|[1-9|a-f|A-F][\d|a-f|A-F]{2}|0[1-9|a-f|A-F][\d|a-f|A-F]{2}|[1-9|a-f|A-F][\d|a-f|A-F]{3}):){7}([\d|a-f|A-F]|0[1-9|a-f|A-F]|[1-9|a-f|A-F][\d|a-f|A-F]|0[1-9|a-f|A-F][\d|a-f|A-F]|[1-9|a-f|A-F][\d|a-f|A-F]{2}|0[1-9|a-f|A-F][\d|a-f|A-F]{2}|[1-9|a-f|A-F][\d|a-f|A-F]{3})$").findall(IP)
        if len(res_ipv4) > 0:
            return "IPv4"
        elif len(res_ipv6) > 0:
            return "IPv6"
        else:
            return "Neither"
发表于 2022-02-10 11:54:33 回复(0)