我希望使用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)。我不知道我需要改变什么才能让这些。
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)
2001:DB8:0:0:0:*
2001:*:1
*但它将无效的IPV6值与"::*“-> 2404:66:4003::*:804匹配
我需要修改regex,以便只允许有效值。我对regex和IP地址概念还很陌生,但无法理解这一点。我需要用JS和Java进行验证。请帮帮我。
发布于 2021-12-14 17:33:21
根据问题评论中的建议,我给出了验证IPV6和IPV4的IP地址的解决方案。我已经通过分割IP地址来验证这一点。PS --我使用了一些IPV6示例,其中包含了一些我遇到的格式。如果我错过了任何用例,请告诉我。
IPV6
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;<!DOCTYPE html>
<html>
<body>
<p id="demo"></p>
</body>
</html>
IPV4
@Maximillian的代码相当不错。我稍微修改了他的代码,以满足我的要求。
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;<!DOCTYPE html>
<html>
<body>
<p id="demo"></p>
</body>
</html>
https://stackoverflow.com/questions/70348674
复制相似问题