Dobra chyba znalazłem poprawne rozwiązanie:
private static final String regex = "(((?=(?>.?::)(?!.::)))(::)?([0-9A-F]{1,4}::?){0,5}|([0-9A-F]{1,4}:){6})(\2([0-9A-F]{1,4}(::?|$)){0,2}|((25[0-5]|(2[0-4]|1\d|[1-9])?\d)(\.|$)){4}|[0-9A-F]{1,4}:[0-9A-F]{1,4})(?<![:]:|\.)\z";
private static final Pattern IPV6_PATTERN = Pattern.compile(regex,Pattern.CASE_INSENSITIVE);
Przynajmniej najbardziej rozbudowana baza testów jaką znalazłem w necie przechodzi:
// The test cases...
ipv6test(false,"");// empty string
ipv6test(true,"::1");// loopback, compressed, non-routable
ipv6test(true,"::");// unspecified, compressed, non-routable
ipv6test(true,"0000:1");// loopback, full
ipv6test(true,"0000:0");// unspecified, full
ipv6test(true,"200108200C:417A");// unicast, full
ipv6test(true,"FF01000:101");// multicast, full
ipv6test(true,"2001800417A");// unicast, compressed
ipv6test(true,"FF01::101");// multicast, compressed
ipv6test(false,"200108200C221");// unicast, full
ipv6test(false,"FF01::2");// multicast, compressed
ipv6test(true,"fe80:f2ffed62");
ipv6test(true,"200112340000ABCD:0876");
ipv6test(true,"3ffe000000010000:000a");
ipv6test(true,"FF02000000000000:0001");
ipv6test(true,"0000000000000000:0001");
ipv6test(true,"0000000000000000:0000");
ipv6test(false,"0200112340000ABCD:0876"); // extra 0 not allowed!
ipv6test(false,"2001123400001ABCD:0876"); // extra 0 not allowed!
*ipv6test(true," 200112340000ABCD:0876"); * leading space
*ipv6test(true,"200112340000ABCD:0876"); * trailing space
*ipv6test(true," 200112340000ABCD:0876 "); * leading and trailing space
ipv6test(false,"200112340000ABCD:0876 0"); // junk after valid address
ipv6test(false,"20011234: 0000C1C00876"); // internal space
ipv6test(false,"3ffe00000000000a"); // seven segments
ipv6test(false,"FF020000000000000001"); // nine segments
ipv6test(false,"3ffe:a"); // double "::"
ipv6test(false,":222244446666::"); // double "::"
ipv6test(true,"2::10");
ipv6test(true,"ff02::1");
ipv6test(true,"fe80::");
ipv6test(true,"2002::");
ipv6test(true,"2001:");
ipv6test(true,"20011234::");
ipv6test(true,":0:0");
ipv6test(true,"::1");
ipv6test(true,"1357:8");
ipv6test(true,"135:8");
ipv6test(true,"135::8");
ipv6test(true,"13:8");
ipv6test(true,"13::8");
ipv6test(true,"1:8");
ipv6test(true,"1::8");
ipv6test(true,"1:357");
ipv6test(true,"1:35:6");
ipv6test(true,"1:35");
ipv6test(true,"1:3:4");
ipv6test(true,"1:3");
ipv6test(true,"1::8");
ipv6test(true,":357:8");
ipv6test(true,":357");
ipv6test(true,":35:6");
ipv6test(true,":35");
ipv6test(true,":3:4");
ipv6test(true,":3");
ipv6test(true,"::8");
ipv6test(true,"135:");
ipv6test(true,"135::");
ipv6test(true,"13:");
ipv6test(true,"13::");
ipv6test(true,"1:");
ipv6test(true,"1::");
ipv6test(true,"135:8");
ipv6test(false,"13:5:8"); // Double "::"
ipv6test(false,"12345:7:8");
ipv6test(true,"138");
ipv6test(true,"13:8");
ipv6test(true,"18");
ipv6test(true,"1:8");
// IPv4 addresses as dotted-quads
ipv6test(true,"1351.2.3.4");
ipv6test(true,"135::1.2.3.4");
ipv6test(true,"13:1.2.3.4");
ipv6test(true,"13::1.2.3.4");
ipv6test(true,"1:1.2.3.4");
ipv6test(true,"1::1.2.3.4");
ipv6test(true,"131.2.3.4");
ipv6test(true,"13:1.2.3.4");
ipv6test(true,"11.2.3.4");
ipv6test(true,"1:1.2.3.4");
ipv6test(true,"1:11.22.33.44");
ipv6test(false,"1:400.2.3.4");
ipv6test(false,"1:260.2.3.4");
ipv6test(false,"1:256.2.3.4");
ipv6test(false,"1:1.256.3.4");
ipv6test(false,"1:1.2.256.4");
ipv6test(false,"1:1.2.3.256");
ipv6test(false,"1:300.2.3.4");
ipv6test(false,"1:1.300.3.4");
ipv6test(false,"1:1.2.300.4");
ipv6test(false,"1:1.2.3.300");
ipv6test(false,"1:900.2.3.4");
ipv6test(false,"1:1.900.3.4");
ipv6test(false,"1:1.2.900.4");
ipv6test(false,"1:1.2.3.900");
ipv6test(false,"1:300.300.300.300");
ipv6test(false,"1:3000.30.30.30");
ipv6test(false,"1::400.2.3.4");
ipv6test(false,"1::260.2.3.4");
ipv6test(false,"1::256.2.3.4");
ipv6test(false,"1::1.256.3.4");
ipv6test(false,"1::1.2.256.4");
ipv6test(false,"1::1.2.3.256");
ipv6test(false,"1::300.2.3.4");
ipv6test(false,"1::1.300.3.4");
ipv6test(false,"1::1.2.300.4");
ipv6test(false,"1::1.2.3.300");
ipv6test(false,"1::900.2.3.4");
ipv6test(false,"1::1.900.3.4");
ipv6test(false,"1::1.2.900.4");
ipv6test(false,"1::1.2.3.900");
ipv6test(false,"1::300.300.300.300");
ipv6test(false,"1::3000.30.30.30");
ipv6test(false,"::400.2.3.4");
ipv6test(false,"::260.2.3.4");
ipv6test(false,"::256.2.3.4");
ipv6test(false,"::1.256.3.4");
ipv6test(false,"::1.2.256.4");
ipv6test(false,"::1.2.3.256");
ipv6test(false,"::300.2.3.4");
ipv6test(false,"::1.300.3.4");
ipv6test(false,"::1.2.300.4");
ipv6test(false,"::1.2.3.300");
ipv6test(false,"::900.2.3.4");
ipv6test(false,"::1.900.3.4");
ipv6test(false,"::1.2.900.4");
ipv6test(false,"::1.2.3.900");
ipv6test(false,"::300.300.300.300");
ipv6test(false,"::3000.30.30.30");
ipv6test(true,"fe80:f2ff:254.7.237.98");
ipv6test(true,":192.168.1.26");
ipv6test(false,"200111255Z255X255Y255"); // garbage instead of "." in IPv4
ipv6test(false,":192x168.1.26"); // ditto
ipv6test(true,":192.168.1.1");
ipv6test(true,"00013.1.68.3");// IPv4-compatible IPv6 address, full, deprecated
ipv6test(true,"000129.144.52.38");// IPv4-mapped IPv6 address, full
ipv6test(true,"::13.1.68.3");// IPv4-compatible IPv6 address, compressed, deprecated
ipv6test(true,":129.144.52.38");// IPv4-mapped IPv6 address, compressed
ipv6test(true,"fe800204254.157.241.86");
ipv6test(true,"fe80:61ff:254.157.241.86");
ipv6test(true,":12.34.56.78");
ipv6test(false,":2.3.4");
ipv6test(false,":257.1.2.3");
ipv6test(false,"1.2.3.4");
ipv6test(false,"1.2.3.422224444::5555"); // Aeron
ipv6test(false,"1.2.3.42222:5555");
ipv6test(false,"1.2.3.42222::5555");
ipv6test(false,"1.2.3.4:5555");
ipv6test(false,"1.2.3.4::5555");
ipv6test(false,"1.2.3.4::");
// Testing IPv4 addresses represented as dotted-quads
// Leading zero's in IPv4 addresses not allowed: some systems treat the leading "0" in ".086" as the start of an octal number
// Update: The BNF in RFC-3986 explicitly defines the dec-octet (for IPv4 addresses) not to have a leading zero
ipv6test(false,"fe8000000204254.157.241.086");
ipv6test(true,":192.0.2.128"); // but this is OK, since there's a single digit
ipv6test(false,"XXXXXXXXXXXX1.2.3.4");
ipv6test(false,"11113333555500.00.00.00");
ipv6test(false,"111133335555000.000.000.000");
ipv6test(false,"111133335555256.256.256.256");
// Not testing address with subnet mask
- ipv6test(true,"2001000000000000:0000/60");* full, with prefix
- ipv6test(true,"200100:0/60");* compressed, with prefix
- ipv6test(true,"20010:/60");* compressed, with prefix //2
- ipv6test(true,"::/128");* compressed, unspecified address type, non-routable
- ipv6test(true,"::1/128");* compressed, loopback address type, non-routable
- ipv6test(true,"FF00::/8");* compressed, multicast address type
- ipv6test(true,"FE80::/10");* compressed, link-local unicast, non-routable
- ipv6test(true,"FEC0::/10");* compressed, site-local unicast, deprecated
- ipv6test(false,"124.15.6.89/60");* standard IPv4, prefix not allowed
ipv6test(true,"fe8000000204fe9d:f156");
ipv6test(true,"fe800204fe9d:f156");
ipv6test(true,"fe80:61fff156");
ipv6test(true,"::1");
ipv6test(true,"fe80::");
ipv6test(true,"fe80::1");
ipv6test(false,":");
ipv6test(true,":c000:280");
// Aeron supplied these test cases
ipv6test(false,"11113333");
ipv6test(false,"11113333:");
ipv6test(false,"1111");
ipv6test(false,"1111:");
ipv6test(false,":");
ipv6test(false,":::");
ipv6test(false,"1111:");
ipv6test(false,":");
ipv6test(false,"22224444::5555");
ipv6test(false,"2222:5555");
ipv6test(false,"2222::5555");
ipv6test(false,":5555");
ipv6test(false,":::5555");
ipv6test(false,":::");
// Additional test cases
- from http:*rt.cpan.org/Public/Bug/Display.html?id=50693
ipv6test(true,"200185a300000370:7334");
ipv6test(true,"200185a30370:7334");
ipv6test(true,"200185a3:370:7334");
ipv6test(true,"2001000000001428:57ab");
ipv6test(true,"200100000000:57ab");
ipv6test(true,"2001001428:57ab");
ipv6test(true,"2001057ab");
ipv6test(true,"200157ab");
ipv6test(true,"200157ab");
ipv6test(true,"0000000000000000:0001");
ipv6test(true,"::1");
ipv6test(true,":0c22:384e");
ipv6test(true,"2001123400000000:0000");
ipv6test(true,"20011234ffffffff:ffff");
ipv6test(true,"2001a::123");
ipv6test(true,"fe80::");
ipv6test(false,"123");
ipv6test(false,"ldkfj");
ipv6test(false,"2001::57ab");
ipv6test(false,"200185a3:37023:7334");
ipv6test(false,"200185a3:370k:7334");
ipv6test(false,"13579");
ipv6test(false,"1::3");
ipv6test(false,"1::4:5");
ipv6test(false,"13:579");
// New from Aeron
ipv6test(true,"1111333355557777:8888");
ipv6test(true,"1111333355557777::");
ipv6test(true,"111133335555:");
ipv6test(true,"111133335555::");
ipv6test(true,"11113333:");
ipv6test(true,"11113333::");
ipv6test(true,"1111:");
ipv6test(true,"1111::");
- ipv6test(true,"::"); *duplicate
ipv6test(true,"111133335555:8888");
ipv6test(true,"111133335555::8888");
ipv6test(true,"11113333:8888");
ipv6test(true,"11113333::8888");
ipv6test(true,"1111:8888");
ipv6test(true,"1111::8888");
ipv6test(true,"::8888");
ipv6test(true,"111133335555:8888");
ipv6test(true,"111133338888");
ipv6test(true,"11113333:8888");
ipv6test(true,"11118888");
ipv6test(true,"1111:8888");
ipv6test(true,":8888");
ipv6test(true,"111133337777:8888");
ipv6test(true,"11113333:7777:8888");
ipv6test(true,"11117777:8888");
ipv6test(true,"1111:7777:8888");
ipv6test(true,":7777:8888");
ipv6test(true,"11113333:66668888");
ipv6test(true,"111166668888");
ipv6test(true,"1111:66668888");
ipv6test(true,":66668888");
ipv6test(true,"111155557777:8888");
ipv6test(true,"1111:55557777:8888");
ipv6test(true,":55557777:8888");
ipv6test(true,"1111:444466668888");
ipv6test(true,":444466668888");
ipv6test(true,":333355557777:8888");
ipv6test(true,"111133335555123.123.123.123");
ipv6test(true,"111133335555::123.123.123.123");
ipv6test(true,"11113333:123.123.123.123");
ipv6test(true,"11113333::123.123.123.123");
ipv6test(true,"1111:123.123.123.123");
ipv6test(true,"1111::123.123.123.123");
ipv6test(true,"::123.123.123.123");
ipv6test(true,"11113333123.123.123.123");
ipv6test(true,"11113333:123.123.123.123");
ipv6test(true,"1111123.123.123.123");
ipv6test(true,"1111:123.123.123.123");
ipv6test(true,":123.123.123.123");
ipv6test(true,"11113333:6666:123.123.123.123");
ipv6test(true,"11116666:123.123.123.123");
ipv6test(true,"1111:6666:123.123.123.123");
ipv6test(true,":6666:123.123.123.123");
ipv6test(true,"11115555123.123.123.123");
ipv6test(true,"1111:5555123.123.123.123");
ipv6test(true,":5555123.123.123.123");
ipv6test(true,"1111:44446666:123.123.123.123");
ipv6test(true,":33335555123.123.123.123");
// Playing with combinations of "0" and "::"
// NB: these are all sytactically correct, but are bad form
// because "0" adjacent to "::" should be combined into "::"
ipv6test(true,":000:0");
ipv6test(true,":000");
ipv6test(true,":00:0");
ipv6test(true,":00");
ipv6test(true,":0:0");
ipv6test(true,":0");
ipv6test(true,"::0");
ipv6test(true,"0000::");
ipv6test(true,"000:");
ipv6test(true,"000::");
ipv6test(true,"00:");
ipv6test(true,"00::");
ipv6test(true,"0:");
ipv6test(true,"0::");
// New invalid from Aeron
// Invalid data
ipv6test(false,"XXXXXXXXXXXXXXXX:XXXX");
// Too many components
ipv6test(false,"11113333555577779999");
ipv6test(false,"1111333355557777:");
ipv6test(false,":3333555577779999");
// Too few components
ipv6test(false,"1111333355557777");
ipv6test(false,"111133335555:6666");
ipv6test(false,"111133335555");
ipv6test(false,"11113333:4444");
ipv6test(false,"11113333");
ipv6test(false,"1111:2222");
ipv6test(false,"1111");
// Missing :
ipv6test(false,"11112222444466668888");
ipv6test(false,"1111444466668888");
ipv6test(false,"11113333444466668888");
ipv6test(false,"1111333366668888");
ipv6test(false,"11113333555566668888");
ipv6test(false,"1111333355558888");
ipv6test(false,"11113333555577778888");
// Missing : intended for ::
ipv6test(false,"1111333355557777");
ipv6test(false,"1111333355557777:");
ipv6test(false,"111133335555");
ipv6test(false,"111133335555:");
ipv6test(false,"11113333");
ipv6test(false,"11113333:");
ipv6test(false,"1111");
ipv6test(false,"1111:");
ipv6test(false,":");
ipv6test(false,":8888");
ipv6test(false,"8888");
ipv6test(false,"7777:8888");
ipv6test(false,"66668888");
ipv6test(false,"55557777:8888");
ipv6test(false,"444466668888");
ipv6test(false,"333355557777:8888");
ipv6test(false,"2222444466668888");
// :::
ipv6test(false,"::333355557777:8888");
ipv6test(false,"1111::444466668888");
ipv6test(false,"1111:55557777:8888");
ipv6test(false,"11113333::66668888");
ipv6test(false,"11113333:7777:8888");
ipv6test(false,"111133335555::8888");
ipv6test(false,"111133335555::8888");
ipv6test(false,"1111333355557777:::");
// Double ::");
ipv6test(false,":55557777:8888");
ipv6test(false,":3333:66668888");
ipv6test(false,":33337777:8888");
ipv6test(false,":33335555:8888");
ipv6test(false,":33335555:8888");
ipv6test(false,":333355558888::");
ipv6test(false,"1111:66668888");
ipv6test(false,"1111:4444:7777:8888");
ipv6test(false,"1111:44448888");
ipv6test(false,"1111:44446666::8888");
ipv6test(false,"1111:44446666:");
ipv6test(false,"11117777:8888");
ipv6test(false,"11115555:8888");
ipv6test(false,"11115555:8888");
ipv6test(false,"111155557777::");
ipv6test(false,"11113333:8888");
ipv6test(false,"11113333:6666::8888");
ipv6test(false,"11113333:6666:");
ipv6test(false,"11113333:8888");
ipv6test(false,"111133337777::");
ipv6test(false,"111133335555::");
// Too many components"
ipv6test(false,"11113333555577771.2.3.4");
ipv6test(false,"1111333355557777:1.2.3.4");
ipv6test(false,"111133335555:1.2.3.4");
ipv6test(false,":333355557777:1.2.3.4");
ipv6test(false,"1111333355551.2.3.4.5");
// Too few components
ipv6test(false,"111133335555:1.2.3.4");
ipv6test(false,"111133331.2.3.4");
ipv6test(false,"11113333:1.2.3.4");
ipv6test(false,"11111.2.3.4");
ipv6test(false,"1111:1.2.3.4");
ipv6test(false,"1.2.3.4");
// Missing :
ipv6test(false,"1111222244446666:1.2.3.4");
ipv6test(false,"111144446666:1.2.3.4");
ipv6test(false,"1111333344446666:1.2.3.4");
ipv6test(false,"111133336666:1.2.3.4");
ipv6test(false,"1111333355556666:1.2.3.4");
ipv6test(false,"111133335555:66661.2.3.4");
// Missing .
ipv6test(false,"111133335555255255.255.255");
ipv6test(false,"111133335555255.255255.255");
ipv6test(false,"111133335555255.255.255255");
// Missing : intended for ::
ipv6test(false,":1.2.3.4");
ipv6test(false,"1.2.3.4");
ipv6test(false,"6666:1.2.3.4");
ipv6test(false,"55551.2.3.4");
ipv6test(false,"44446666:1.2.3.4");
ipv6test(false,"333355551.2.3.4");
ipv6test(false,"222244446666:1.2.3.4");
// :::
ipv6test(false,"::333355551.2.3.4");
ipv6test(false,"1111::44446666:1.2.3.4");
ipv6test(false,"1111:55551.2.3.4");
ipv6test(false,"11113333::6666:1.2.3.4");
ipv6test(false,"11113333:1.2.3.4");
ipv6test(false,"111133335555:::1.2.3.4");
// Double ::
ipv6test(false,":55551.2.3.4");
ipv6test(false,":3333:6666:1.2.3.4");
ipv6test(false,":33331.2.3.4");
ipv6test(false,":33335555::1.2.3.4");
ipv6test(false,"1111:6666:1.2.3.4");
ipv6test(false,"1111:4444:1.2.3.4");
ipv6test(false,"1111:4444:1.2.3.4");
ipv6test(false,"11111.2.3.4");
ipv6test(false,"11115555::1.2.3.4");
ipv6test(false,"11113333::1.2.3.4");
// Missing parts
ipv6test(false,"::.");
ipv6test(false,"::..");
ipv6test(false,"::...");
ipv6test(false,"::1...");
ipv6test(false,"::1.2..");
ipv6test(false,"::1.2.3.");
ipv6test(false,"::.2..");
ipv6test(false,"::.2.3.");
ipv6test(false,"::.2.3.4");
ipv6test(false,"::..3.");
ipv6test(false,"::..3.4");
ipv6test(false,"::...4");
// Extra : in front
ipv6test(false,"222244446666:");
ipv6test(false,"222244446666::");
ipv6test(false,"22224444:");
ipv6test(false,"22224444::");
ipv6test(false,"2222:");
ipv6test(false,"2222::");
ipv6test(false,":");
ipv6test(false,":::");
ipv6test(false,"222244446666::8888");
ipv6test(false,"22224444:8888");
ipv6test(false,"22224444::8888");
ipv6test(false,"2222:8888");
ipv6test(false,"2222::8888");
ipv6test(false,":8888");
ipv6test(false,":::8888");
ipv6test(false,"222244448888");
ipv6test(false,"22224444:8888");
ipv6test(false,"22228888");
ipv6test(false,"2222:8888");
ipv6test(false,"8888");
ipv6test(false,"::8888");
ipv6test(false,"22224444:7777:8888");
ipv6test(false,"22227777:8888");
ipv6test(false,"2222:7777:8888");
ipv6test(false,"7777:8888");
ipv6test(false,"::7777:8888");
ipv6test(false,"222266668888");
ipv6test(false,"2222:66668888");
ipv6test(false,"66668888");
ipv6test(false,"::66668888");
ipv6test(false,"2222:55557777:8888");
ipv6test(false,"55557777:8888");
ipv6test(false,"::55557777:8888");
ipv6test(false,"444466668888");
ipv6test(false,"::444466668888");
ipv6test(false,"::333355557777:8888");
ipv6test(false,"222244446666:1.2.3.4");
ipv6test(false,"22224444:1.2.3.4");
ipv6test(false,"22224444::1.2.3.4");
ipv6test(false,"2222:1.2.3.4");
ipv6test(false,"2222::1.2.3.4");
ipv6test(false,":1.2.3.4");
ipv6test(false,":::1.2.3.4");
ipv6test(false,"22224444:1.2.3.4");
ipv6test(false,"22221.2.3.4");
ipv6test(false,"2222:1.2.3.4");
ipv6test(false,"1.2.3.4");
ipv6test(false,"::1.2.3.4");
ipv6test(false,"22226666:1.2.3.4");
ipv6test(false,"2222:6666:1.2.3.4");
ipv6test(false,"6666:1.2.3.4");
ipv6test(false,"::6666:1.2.3.4");
ipv6test(false,"2222:55551.2.3.4");
ipv6test(false,"55551.2.3.4");
ipv6test(false,"::55551.2.3.4");
ipv6test(false,"44446666:1.2.3.4");
ipv6test(false,"::333355551.2.3.4");
// Extra : at end
ipv6test(false,"1111333355557777:::");
ipv6test(false,"111133335555::");
ipv6test(false,"111133335555:::");
ipv6test(false,"11113333::");
ipv6test(false,"11113333:::");
ipv6test(false,"1111::");
ipv6test(false,"1111:::");
ipv6test(false,":::");
ipv6test(false,"111133335555");
ipv6test(false,"111133335555:");
ipv6test(false,"11113333");
ipv6test(false,"11113333:");
ipv6test(false,"1111");
ipv6test(false,"1111:");
ipv6test(false,":");
ipv6test(false,"111133335555:8888:");
ipv6test(false,"111133338888:");
ipv6test(false,"11113333:8888:");
ipv6test(false,"11118888:");
ipv6test(false,"1111:8888:");
ipv6test(false,":8888:");
ipv6test(false,"111133337777");
ipv6test(false,"11113333:7777");
ipv6test(false,"11117777");
ipv6test(false,"1111:7777");
ipv6test(false,":7777");
ipv6test(false,"11113333:66668888:");
ipv6test(false,"111166668888:");
ipv6test(false,"1111:66668888:");
ipv6test(false,":66668888:");
ipv6test(false,"111155557777");
ipv6test(false,"1111:55557777");
ipv6test(false,":55557777");
ipv6test(false,"1111:444466668888:");
ipv6test(false,":444466668888:");
ipv6test(false,":333355557777");
- Additional cases: http:*crisp.tweakblogs.net/blog/2031/ipv6-validation-%28and-caveats%29.html
ipv6test(true,"0bdf::");
ipv6test(true,":ace:f"); // syntactically correct, but bad form (:... could be combined)
ipv6test(true,"ace0::");
ipv6test(false,"':10.0.0.1");
Wielkie dzięki za pomoc, fajne stronki podałeś (pomocne). A bym zapomniał całość pochodzi stąd:
http://www.intermapper.com/ipv6validator
Ciekawe tylko czy ich baza przypadków testowych jest komplentna?