2008-09-05 9 views

Répondre

17
public static final String IPV4_REGEX = "\\A(25[0-5]|2[0-4]\\d|[0-1]?\\d?\\d)(\\.(25[0-5]|2[0-4]\\d|[0-1]?\\d?\\d)){3}\\z"; 
public static final String IPV6_HEX4DECCOMPRESSED_REGEX = "\\A((?:[0-9A-Fa-f]{1,4}(?::[0-9A-Fa-f]{1,4})*)?) ::((?:[0-9A-Fa-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}\\z"; 
public static final String IPV6_6HEX4DEC_REGEX = "\\A((?:[0-9A-Fa-f]{1,4}:){6,6})(25[0-5]|2[0-4]\\d|[0-1]?\\d?\\d)(\\.(25[0-5]|2[0-4]\\d|[0-1]?\\d?\\d)){3}\\z"; 
public static final String IPV6_HEXCOMPRESSED_REGEX = "\\A((?:[0-9A-Fa-f]{1,4}(?::[0-9A-Fa-f]{1,4})*)?)::((?:[0-9A-Fa-f]{1,4}(?::[0-9A-Fa-f]{1,4})*)?)\\z"; 
public static final String IPV6_REGEX = "\\A(?:[0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}\\z"; 

Vous avez ces pages d'un blog. Quelqu'un de bon w/regex devrait être capable de trouver une seule regex pour tous les types d'adresses IPv6. En fait, je suppose que vous pourriez avoir une seule regex qui correspond à IPv4 et IPv6.

+5

Oui, pas quelqu'un doute devrait trouver une seule regex englobante - celles-ci sont loin, beaucoup trop courtes en l'état. –

+0

Merci! Ce sont un bon point de départ. Mais j'ai trouvé que IPV6_HEXCOMPRESSED_REGEX acceptera "1 :: 2: 3: 4: 5: 6: 7: 8", ce qui n'est pas valide puisque vous ne pouvez pas avoir plus de 8 groupements et :: implique plus de groupements compressés . – gusterlover6

3

est ici une expression régulière pour correspondre aux adresses IPv4:

\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b 

Vous devez les backslashs lorsque vous spécifiez comme une chaîne littérale en Java:

"\\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\b" 
6

Une autre bonne option pour le traitement IPs utilise les classes Java Inet4Address et Inet6Address, ce qui peut être utile de plusieurs façons, dont l'une est de déterminer la validité de l'adresse IP.

Je sais que cela ne répond pas directement à la question, mais j'ai juste pensé qu'il vaut la peine de le mentionner.

0

La regex permet l'utilisation de zéros en tête dans les parties IPv4.

Certaines distributions Unix et Mac convertissent ces segments en octals.

Je suggère d'utiliser 25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d en tant que segment IPv4.

0

Les expressions régulières pour ipv6 peuvent être très compliquées lorsque vous considérez des adresses avec ipv4 intégré et des adresses compressées.

The open-source IPAddress Java library va valider toutes les représentations standard de IPv6 et IPv4 et prend également en charge la longueur de préfixe (et la validation de telles). Disclaimer: Je suis le chef de projet de cette bibliothèque.

Exemple de code:

try { 
    IPAddressString str = new IPAddressString("::1"); 
    IPAddress addr = str.toAddress(); 
} catch(AddressStringException e) { 
    //e.getMessage has validation error 
} 
Questions connexes