首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >(替代解决方案)使用Regex使用通配符(*)验证IPV4和IPV6

(替代解决方案)使用Regex使用通配符(*)验证IPV4和IPV6
EN

Stack Overflow用户
提问于 2021-12-14 12:11:55
回答 1查看 284关注 0票数 1

我希望使用regex使用通配符(*)验证IP地址。我为IPV4和IPV6提出了以下正则表达式,但这些正则表达式并不能验证所有用例。

IPV4

^(((0-9{1,2})|(10-9{2,2})|(20-4)|(250-5)|*).){3}((0-9{1,2})|(10-9{2,2})|(20-4)|(250-5)|*)$

此正则表达式不匹配以下四种有效的IPV4格式(https://regex101.com/r/RXf5yM/1)。我不知道我需要改变什么才能让这些。

代码语言:javascript
复制
192.*
192.0.*
192.*.2
*

IPV6

^\s*(((((0-9A-Fa-f{1,4})|*):){7}(((0-9A-Fa-f{1,4})|*)|:))|((((0-9A-Fa-f{1,4})|*):){6}(:((0-9A-Fa-f{1,4})|*)|((250-5|20-4\d|1\d\d|1-9?\d)(.(250-5|20-4\d|1\d\d|1-9?\d)){3})|:))|((((0-9A-Fa-f{1,4})|*):){5}(((:((0-9A-Fa-f{1,4})|*)){1,2})|:((250-5|20-4\d|1\d\d|1-9?\d)(.(250-5|20-4\d|1\d\d|1-9?\d)){3})|:))|((((0-9A-Fa-f{1,4})|*):){4}(((:((0-9A-Fa-f{1,4})|*)){1,3})|((:((0-9A-Fa-f{1,4})|*))?:((250-5|20-4\d|1\d\d|1-9?\d)(.(250-5|20-4\d|1\d\d|1-9?\d)){3}))|:))|((((0-9A-Fa-f{1,4})|*):){3}(((:((0-9A-Fa-f{1,4})|*)){1,4})|((:((0-9A-Fa-f{1,4})|*)){0,2}:((250-5|20-4\d|1\d\d|1-9?\d)(.(250-5|20-4\d|1\d\d|1-9?\d)){3}))|:))|((((0-9A-Fa-f{1,4})|*):){2}(((:((0-9A-Fa-f{1,4})|*)){1,5})|((:((0-9A-Fa-f{1,4})|*)){0,3}:((250-5|20-4\d|1\d\d|1-9?\d)(.(250-5|20-4\d|1\d\d|1-9?\d)){3}))|:))|((((0-9A-Fa-f{1,4})|*):){1}(((:((0-9A-Fa-f{1,4})|*)){1,6})|((:((0-9A-Fa-f{1,4})|*)){0,4}:((250-5|20-4\d|1\d\d|1-9?\d)(.(250-5|20-4\d|1\d\d|1-9?\d)){3}))|:))|(:(((:((0-9A-Fa-f{1,4})|*)){1,7})|((:((0-9A-Fa-f{1,4})|*)){0,5}:((250-5|20-4\d|1\d\d|1-9?\d)(.(250-5|20-4\d|1\d\d|1-9?\d)){3}))|:)))\s*$

此正则表达式不匹配以下三种有效的IPV6格式。(https://regex101.com/r/ereIrE/1)

代码语言:javascript
复制
2001:DB8:0:0:0:*
2001:*:1
*

但它将无效的IPV6值与"::*“-> 2404:66:4003::*:804匹配

我需要修改regex,以便只允许有效值。我对regex和IP地址概念还很陌生,但无法理解这一点。我需要用JS和Java进行验证。请帮帮我。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-12-14 17:33:21

根据问题评论中的建议,我给出了验证IPV6和IPV4的IP地址的解决方案。我已经通过分割IP地址来验证这一点。PS --我使用了一些IPV6示例,其中包含了一些我遇到的格式。如果我错过了任何用例,请告诉我。

IPV6

代码语言:javascript
复制
function evalIp6(ipAddress) {
    var ipAddrList = ipAddress.split(":")     
    var count =ipAddress.split("::").length-1;   
    if(ipAddrList.length>8 && !(ipAddress.split(":").length == 9 && ipAddrList[ipAddrList.length-1]=="" && count == 1 ))
            //IPV6 Cannot have more than 8 groups
            //Second if check to allow '::' in end after 7 groups. Eg : 2001:db8:122:344:c0:2:2100::
     {
      return false;
     }
    if(count>1)//IPV6 cannot have more that one "::"
    {
        return false;
    }
   
    if(ipAddress.indexOf("::*") != -1 || ipAddress.indexOf("*::") != -1)//IPV6 cannot have consecutive wildcard(*) with "::" since it can have multiple combinations.
    {
      return false;
    } 
    var isWildCardPresent = false;
    for (let i = 0; i < ipAddrList.length; i++) {

        if(!isIPV6Group(ipAddrList[i]))
        {
            return false;
        }
        if(ipAddrList[i]  == "*")
        {
            isWildCardPresent = true;
        }
        
    }
   if(!isWildCardPresent && count == 0 && ipAddrList.length!=8)//Without wildcard and :: , less. than 8 groups present. So it is invalid.
   {
        return false;
   }
   
   
    return true
}


function isIPV6Group(x)
{
    var ipv6GroupRegex = "^(([0-9A-Fa-f]{1,4})|\\*|)$";
    //Allows Numbers 0 to FFFF or * or empty string (for group between ::)
  ipv6GroupRegex = new RegExp(ipv6GroupRegex);

  return ipv6GroupRegex.test(x);
}




var IPAddrTestList = [
"2404:6800:4003:c02::8a",
"2404:6800:4003:804::200e",
"2001:4998:c:a06::2:4008",
"fe80::21d8:f50:c295:c4be",
"2001:cdba::e:9652",
"2001:cdba:0:0:0:0:3257:9652",
"2001:cdba::3257:9652",
"2001:cdba::1222",
"21DA:D3:0:2F3B:2AA:FF:FE28:9C5A",
"2001:cdba::1:2:3:3257:9652",
"1234:Fd2:2:1:89::4500",
"1234:Fd2:12:1:89::4500",
"1080:0:0:0:8:800:200C:417A",
"1080::8:800:200C:417A",
"3210::",
"::",
"2001:B07:6473:B409:C05C:AC2B:C9B9:CC42",
"2A0C:9A40:8170::1",
"64:FF9B::CD8B:6384",
"FE80::4ABA:4EFF:FED4:6455",
"FE80::3E5C:C4FF:FE3B:AC19",
"FE80::3E5C:C4FF:FEA6:D45D",
"FE80::266:86FF:FE05:7933",
"2A03:2880:F127:83:FACE:B00C:0:25DE",
"2A00:5A60::AD1:FF",
"a:b::",
"2001:470:b0b4:1:280:c6ff:fef2:9410",
"2001:868:100::3",
"2001:888:144a::a441:888:1002",
"::1",
"2001:db8:122:3c0:0:221::",
"2001:db8:122:c000:2:2100::",
"2001:db8:1c0:2:21::",
"2001:db8:c000:221::",
"2001:db8:122:344:c0:2:2100::",


//IPV6 With wildcard
"2001:DB8:0:0:0:*:*:*",
"2001:DB8::0:*",
"2001:DB8:0:0:0:*:0:1",
"2001:DB8:0:0:0:*",
"2001:*:1",
"*",

//After this everything invalid
"2404:66:4003::*:804",
"2404:66:4003:34:*:804:35:35:35",


//Invalid IPV6 without wildcard
"2404::4003:804::200e",
"2001:cdba:e:9652",
"2404:6800:40003:c02::8a",
"1:2:3:4:5:6:7:8:9",
"a::b::c",
"x:x:x:x:x:x:x:x",
"::2222:3333:4444:5555:7777:8888::",

//IPV4 mapped with IPV6
"::FFFF:1.2.3.4",
"2001:db8:122:344::192.0.2.33",
"64:ff9b::192.0.2.33",
"::FFFF:189.203.69.53",
"::FFFF:94.8.43.194",
"::FFFF:174.238.136.77",
"::FFFF:142.234.162.5"
]
var result = "";
for(var index=0;index<IPAddrTestList.length;index++)
{
  var resultObj = IPAddrTestList[index] + "---->" + evalIp6(IPAddrTestList[index]);  
  result = result+resultObj+'<br>';
 
}
document.getElementById("demo").innerHTML = result;
代码语言:javascript
复制
<!DOCTYPE html>
<html>
<body>
<p id="demo"></p>
</body>
</html>

IPV4

@Maximillian的代码相当不错。我稍微修改了他的代码,以满足我的要求。

代码语言:javascript
复制
function evalIpv4(str) {
    var arr = str.split(".")
   
   var isWildCardPresent = false;
    for (var i = 0; i < arr.length; i++) {
            if(arr[i] === '*')
        {
             isWildCardPresent = true;
        }
        if (!(arr[i] === '*' || inRange(parseInt(arr[i]), 0, 255))) {
            return false
        }
    }
    if((arr.length < 4 && !isWildCardPresent)|| (arr.length > 4))//Less than 4 digits present without wildcard or more than 4 octets not allowed
    {
        return false;
    }
    return true
}

function inRange(x, min, max) {
    return x >= min && x <= max;
}



var IPAddrTestList = [
"192.192.192.192",
"*.*.1.1",
"*.1.1.*",
"*.*.1.*",
"192.*.23.34",
"*.192.23.*",
"192.0.*.0",
"192.*.*.*",
"192.*",//equal to 192.*.*.*
"192.0.*",//equal to 192.0.*.*
"*",//equal to *.*.*.*
"19.*.23",//equal to 19.*.23.*
"*.24.23",//equal to *.24.23.*,
"192.12",//false - less than 4 octets
"256.23.23.34"//false - 1st octet > 255
]

var result = "";
for(var index=0;index<IPAddrTestList.length;index++)
{
  var resultObj = IPAddrTestList[index] + "---->" + evalIpv4(IPAddrTestList[index]);  
  result = result+resultObj+'<br>';
 
}
document.getElementById("demo").innerHTML = result;
代码语言:javascript
复制
<!DOCTYPE html>
<html>
<body>
<p id="demo"></p>
</body>
</html>

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70348674

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档