my $re = qr{ (?> \b ((?&IPV6) | (?&IPV4)) \b ) (?(DEFINE) (? ( ((?&H16) :){6} (?&LS32)) | ( :: ((?&H16) :){5} (?&LS32)) | (( (?&H16))? :: ((?&H16) :){4} (?&LS32)) | ((((?&H16) :){0,1} (?&H16))? :: ((?&H16) :){3} (?&LS32)) | ((((?&H16) :){0,2} (?&H16))? :: ((?&H16) :){2} (?&LS32)) | ((((?&H16) :){0,3} (?&H16))? :: ((?&H16) :){1} (?&LS32)) | ((((?&H16) :){0,4} (?&H16))? :: (?&LS32)) | ((((?&H16) :){0,5} (?&H16))? :: (?&H16) ) | ((((?&H16) :){0,6} (?&H16))? :: ) ) (? ((?&H16) : (?&H16)) | (?&IPV4) ) (? (?&HEX_DIGIT){1,4} ) (? [a-fA-F0-9] ) (? ((?&DEC_OCTET)\.){3}(?&DEC_OCTET) ) (? 25[0-5]|2[0-4]\d|1\d\d|\d\d|\d ) (? v(?&HEX_DIGIT)+\.((?&UNRESERVED) | (?&SUB_DELIMS) | : )+ ) (?[a-zA-Z0-9\-\._~] ) (?[!\$&'\(\)\*\+,;=] ) ) }x; #### if ("This is the same address in IPv6: 0:0:0:0:0:0:0:1 and 127.0.0.1" =~ /$re/g ) { say $&; say $1; say $2; }