Skip to content

Instantly share code, notes, and snippets.

@ZLightning
Last active November 2, 2017 01:02
Show Gist options
  • Save ZLightning/71d44f5c5c91f241ff7d1c02615e9ea2 to your computer and use it in GitHub Desktop.
Save ZLightning/71d44f5c5c91f241ff7d1c02615e9ea2 to your computer and use it in GitHub Desktop.
IPv6 Regex
'use strict';
//JavaScript RegExp is compatible with Java as a string literal
//strict means :: compression will not be allowed for a single 16 bit 0 segment
var strictNonPaddedIPv6 = /^(?:(?:0(?![0-9a-fA-F])|[1-9a-fA-F][0-9a-fA-F]{0,3}:){7}(?:0(?![0-9a-fA-F])|[1-9a-fA-F][0-9a-fA-F]{0,3})|(?:0(?![0-9a-fA-F])|[1-9a-fA-F][0-9a-fA-F]{0,3}:){1,6}:|(?:0(?![0-9a-fA-F])|[1-9a-fA-F][0-9a-fA-F]{0,3}:){1,5}:(?:0(?![0-9a-fA-F])|[1-9a-fA-F][0-9a-fA-F]{0,3})|(?:0(?![0-9a-fA-F])|[1-9a-fA-F][0-9a-fA-F]{0,3}:){1,4}:(?:0(?![0-9a-fA-F])|[1-9a-fA-F][0-9a-fA-F]{0,3}:)(?:0(?![0-9a-fA-F])|[1-9a-fA-F][0-9a-fA-F]{0,3})|(?:0(?![0-9a-fA-F])|[1-9a-fA-F][0-9a-fA-F]{0,3}:){1,3}:(?:0(?![0-9a-fA-F])|[1-9a-fA-F][0-9a-fA-F]{0,3}:){2}(?:0(?![0-9a-fA-F])|[1-9a-fA-F][0-9a-fA-F]{0,3})|(?:0(?![0-9a-fA-F])|[1-9a-fA-F][0-9a-fA-F]{0,3}:){1,2}:(?:0(?![0-9a-fA-F])|[1-9a-fA-F][0-9a-fA-F]{0,3}:){3}(?:0(?![0-9a-fA-F])|[1-9a-fA-F][0-9a-fA-F]{0,3})|(?:0(?![0-9a-fA-F])|[1-9a-fA-F][0-9a-fA-F]{0,3}:):(?:0(?![0-9a-fA-F])|[1-9a-fA-F][0-9a-fA-F]{0,3}:){4}(?:0(?![0-9a-fA-F])|[1-9a-fA-F][0-9a-fA-F]{0,3})|::(?:(?:0(?![0-9a-fA-F])|[1-9a-fA-F][0-9a-fA-F]{0,3}:){0,6}(?:0(?![0-9a-fA-F])|[1-9a-fA-F][0-9a-fA-F]{0,3}))?)$/
//nonPadded means leading 0s in each segment are not allowed
var nonPaddedIPv6 = /^(?:(?:0(?![0-9a-fA-F])|[1-9a-fA-F][0-9a-fA-F]{0,3}:){7}(?:0(?![0-9a-fA-F])|[1-9a-fA-F][0-9a-fA-F]{0,3})|(?:0(?![0-9a-fA-F])|[1-9a-fA-F][0-9a-fA-F]{0,3}:){1,7}:|(?:0(?![0-9a-fA-F])|[1-9a-fA-F][0-9a-fA-F]{0,3}:){1,6}:(?:0(?![0-9a-fA-F])|[1-9a-fA-F][0-9a-fA-F]{0,3})|(?:0(?![0-9a-fA-F])|[1-9a-fA-F][0-9a-fA-F]{0,3}:){1,5}:(?:0(?![0-9a-fA-F])|[1-9a-fA-F][0-9a-fA-F]{0,3}:)(?:0(?![0-9a-fA-F])|[1-9a-fA-F][0-9a-fA-F]{0,3})|(?:0(?![0-9a-fA-F])|[1-9a-fA-F][0-9a-fA-F]{0,3}:){1,4}:(?:0(?![0-9a-fA-F])|[1-9a-fA-F][0-9a-fA-F]{0,3}:){2}(?:0(?![0-9a-fA-F])|[1-9a-fA-F][0-9a-fA-F]{0,3})|(?:0(?![0-9a-fA-F])|[1-9a-fA-F][0-9a-fA-F]{0,3}:){1,3}:(?:0(?![0-9a-fA-F])|[1-9a-fA-F][0-9a-fA-F]{0,3}:){3}(?:0(?![0-9a-fA-F])|[1-9a-fA-F][0-9a-fA-F]{0,3})|(?:0(?![0-9a-fA-F])|[1-9a-fA-F][0-9a-fA-F]{0,3}:){1,2}:(?:0(?![0-9a-fA-F])|[1-9a-fA-F][0-9a-fA-F]{0,3}:){4}(?:0(?![0-9a-fA-F])|[1-9a-fA-F][0-9a-fA-F]{0,3})|(?:0(?![0-9a-fA-F])|[1-9a-fA-F][0-9a-fA-F]{0,3}:):(?:0(?![0-9a-fA-F])|[1-9a-fA-F][0-9a-fA-F]{0,3}:){5}(?:0(?![0-9a-fA-F])|[1-9a-fA-F][0-9a-fA-F]{0,3})|::(?:(?:0(?![0-9a-fA-F])|[1-9a-fA-F][0-9a-fA-F]{0,3}:){0,6}(?:0(?![0-9a-fA-F])|[1-9a-fA-F][0-9a-fA-F]{0,3}))?)$/
//padded means all segments must be 4 digits long (:: compression not allowed)
var paddedIPv6 = /^(?:[0-9a-fA-F]{4}:){7}[0-9a-fA-F]{4}$/
//all or none referrs to padding, :: compression not allowed on padded
var strictAllOrNoneIPv6 = /^(?:(?:0(?![0-9a-fA-F])|[1-9a-fA-F][0-9a-fA-F]{0,3}:){7}(?:0(?![0-9a-fA-F])|[1-9a-fA-F][0-9a-fA-F]{0,3})|(?:0(?![0-9a-fA-F])|[1-9a-fA-F][0-9a-fA-F]{0,3}:){1,6}:|(?:0(?![0-9a-fA-F])|[1-9a-fA-F][0-9a-fA-F]{0,3}:){1,5}:(?:0(?![0-9a-fA-F])|[1-9a-fA-F][0-9a-fA-F]{0,3})|(?:0(?![0-9a-fA-F])|[1-9a-fA-F][0-9a-fA-F]{0,3}:){1,4}:(?:0(?![0-9a-fA-F])|[1-9a-fA-F][0-9a-fA-F]{0,3}:)(?:0(?![0-9a-fA-F])|[1-9a-fA-F][0-9a-fA-F]{0,3})|(?:0(?![0-9a-fA-F])|[1-9a-fA-F][0-9a-fA-F]{0,3}:){1,3}:(?:0(?![0-9a-fA-F])|[1-9a-fA-F][0-9a-fA-F]{0,3}:){2}(?:0(?![0-9a-fA-F])|[1-9a-fA-F][0-9a-fA-F]{0,3})|(?:0(?![0-9a-fA-F])|[1-9a-fA-F][0-9a-fA-F]{0,3}:){1,2}:(?:0(?![0-9a-fA-F])|[1-9a-fA-F][0-9a-fA-F]{0,3}:){3}(?:0(?![0-9a-fA-F])|[1-9a-fA-F][0-9a-fA-F]{0,3})|(?:0(?![0-9a-fA-F])|[1-9a-fA-F][0-9a-fA-F]{0,3}:):(?:0(?![0-9a-fA-F])|[1-9a-fA-F][0-9a-fA-F]{0,3}:){4}(?:0(?![0-9a-fA-F])|[1-9a-fA-F][0-9a-fA-F]{0,3})|::(?:(?:0(?![0-9a-fA-F])|[1-9a-fA-F][0-9a-fA-F]{0,3}:){0,6}(?:0(?![0-9a-fA-F])|[1-9a-fA-F][0-9a-fA-F]{0,3}))?|(?:[0-9a-fA-F]{4}:){7}[0-9a-fA-F]{4})$/
var allOrNoneIPv6 = /^(?:(?:0(?![0-9a-fA-F])|[1-9a-fA-F][0-9a-fA-F]{0,3}:){7}(?:0(?![0-9a-fA-F])|[1-9a-fA-F][0-9a-fA-F]{0,3})|(?:0(?![0-9a-fA-F])|[1-9a-fA-F][0-9a-fA-F]{0,3}:){1,7}:|(?:0(?![0-9a-fA-F])|[1-9a-fA-F][0-9a-fA-F]{0,3}:){1,6}:(?:0(?![0-9a-fA-F])|[1-9a-fA-F][0-9a-fA-F]{0,3})|(?:0(?![0-9a-fA-F])|[1-9a-fA-F][0-9a-fA-F]{0,3}:){1,5}:(?:0(?![0-9a-fA-F])|[1-9a-fA-F][0-9a-fA-F]{0,3}:)(?:0(?![0-9a-fA-F])|[1-9a-fA-F][0-9a-fA-F]{0,3})|(?:0(?![0-9a-fA-F])|[1-9a-fA-F][0-9a-fA-F]{0,3}:){1,4}:(?:0(?![0-9a-fA-F])|[1-9a-fA-F][0-9a-fA-F]{0,3}:){2}(?:0(?![0-9a-fA-F])|[1-9a-fA-F][0-9a-fA-F]{0,3})|(?:0(?![0-9a-fA-F])|[1-9a-fA-F][0-9a-fA-F]{0,3}:){1,3}:(?:0(?![0-9a-fA-F])|[1-9a-fA-F][0-9a-fA-F]{0,3}:){3}(?:0(?![0-9a-fA-F])|[1-9a-fA-F][0-9a-fA-F]{0,3})|(?:0(?![0-9a-fA-F])|[1-9a-fA-F][0-9a-fA-F]{0,3}:){1,2}:(?:0(?![0-9a-fA-F])|[1-9a-fA-F][0-9a-fA-F]{0,3}:){4}(?:0(?![0-9a-fA-F])|[1-9a-fA-F][0-9a-fA-F]{0,3})|(?:0(?![0-9a-fA-F])|[1-9a-fA-F][0-9a-fA-F]{0,3}:):(?:0(?![0-9a-fA-F])|[1-9a-fA-F][0-9a-fA-F]{0,3}:){5}(?:0(?![0-9a-fA-F])|[1-9a-fA-F][0-9a-fA-F]{0,3})|::(?:(?:0(?![0-9a-fA-F])|[1-9a-fA-F][0-9a-fA-F]{0,3}:){0,6}(?:0(?![0-9a-fA-F])|[1-9a-fA-F][0-9a-fA-F]{0,3}))?|(?:[0-9a-fA-F]{4}:){7}[0-9a-fA-F]{4})$/
//Matches all valid IPv6 addresses except IPv4 mapped IPv6 (like ::1.2.3.4 and ::ffff:1.2.3.4)
var IPv6 = /^(?:(?:[0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|(?:[0-9a-fA-F]{1,4}:){1,7}:|(?:[0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|(?:[0-9a-fA-F]{1,4}:){1,5}:(?:[0-9a-fA-F]{1,4}:)[0-9a-fA-F]{1,4}|(?:[0-9a-fA-F]{1,4}:){1,4}:(?:[0-9a-fA-F]{1,4}:){2}[0-9a-fA-F]{1,4}|(?:[0-9a-fA-F]{1,4}:){1,3}:(?:[0-9a-fA-F]{1,4}:){3}[0-9a-fA-F]{1,4}|(?:[0-9a-fA-F]{1,4}:){1,2}:(?:[0-9a-fA-F]{1,4}:){4}[0-9a-fA-F]{1,4}|(?:[0-9a-fA-F]{1,4}:){1,1}:(?:[0-9a-fA-F]{1,4}:){5}[0-9a-fA-F]{1,4}|::(?:(?:[0-9a-fA-F]{1,4}:){0,6}[0-9a-fA-F]{1,4})?)$/
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment