Regexes are a powerful tool to match on patterns. I use them myself too. And for the given case they might be OK.
But that doesn't mean they are easy to maintain or to debug due to its concatenation of gibberish.
Before you know you might end up with something like this (incorrect and should be on one line)(([0-9a-f]{1,4}:){1,1}(:[0-9a-f]{1,4}){1,6})|
(([0-9a-f]{1,4}:){1,2}(:[0-9a-f]{1,4}){1,5})|
(([0-9a-f]{1,4}:){1,3}(:[0-9a-f]{1,4}){1,4})|
(([0-9a-f]{1,4}:){1,4}(:[0-9a-f]{1,4}){1,3})|
(([0-9a-f]{1,4}:){1,5}(:[0-9a-f]{1,4}){1,2})|
(([0-9a-f]{1,4}:){1,6}(:[0-9a-f]{1,4}){1,1})|
((([0-9a-f]{1,4}:){1,7}|:):)|
(:(:[0-9a-f]{1,4}){1,7})|
(((([0-9a-f]{1,4}:){6})(25[0-5]|2[0-4]\d|[0-1]?\d?\d)(\.(25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3}))|
((([0-9a-f]{1,4}:){5}[0-9a-f]{1,4}:(25[0-5]|2[0-4]\d|[0-1]?\d?\d)(\.(25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3}))|
(([0-9a-f]{1,4}:){5}:[0-9a-f]{1,4}:(25[0-5]|2[0-4]\d|[0-1]?\d?\d)(\.(25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3})|
(([0-9a-f]{1,4}:){1,1}(:[0-9a-f]{1,4}){1,4}:(25[0-5]|2[0-4]\d|[0-1]?\d?\d)(\.(25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3})|
(([0-9a-f]{1,4}:){1,2}(:[0-9a-f]{1,4}){1,3}:(25[0-5]|2[0-4]\d|[0-1]?\d?\d)(\.(25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3})|
(([0-9a-f]{1,4}:){1,3}(:[0-9a-f]{1,4}){1,2}:(25[0-5]|2[0-4]\d|[0-1]?\d?\d)(\.(25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3})|
(([0-9a-f]{1,4}:){1,4}(:[0-9a-f]{1,4}){1,1}:(25[0-5]|2[0-4]\d|[0-1]?\d?\d)(\.(25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3})|
((([0-9a-f]{1,4}:){1,5}|:):(25[0-5]|2[0-4]\d|[0-1]?\d?\d)(\.(25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3})|
(:(:[0-9a-f]{1,4}){1,5}:(25[0-5]|2[0-4]\d|[0-1]?\d?\d)(\.(25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3})