57 votes

Validation d'une chaîne IPv4 en Java

La méthode ci-dessous valide si la chaîne de caractères est une adresse IPv4 correcte et renvoie vrai si elle est valide. Toute amélioration en matière de regex et d'élégance serait très appréciée :

public static boolean validIP(String ip) {
    if (ip == null || ip.isEmpty()) return false;
    ip = ip.trim();
    if ((ip.length() < 6) & (ip.length() > 15)) return false;

    try {
        Pattern pattern = Pattern.compile("^(?:(?: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]?)$");
        Matcher matcher = pattern.matcher(ip);
        return matcher.matches();
    } catch (PatternSyntaxException ex) {
        return false;
    }
}

3voto

firelynx Points 56

Je pense que la bonne façon de faire est de construire un IPAddress et l'instanciez en lui donnant une représentation en chaîne de l'adresse IP.

De cette façon, vous pouvez répartir les différentes étapes de validation dans des méthodes d'instance et obtenir une certaine séparation des tâches aller.

Par exemple, ceci est typiquement une méthode à part entière, que l'on appelle simplement isEmpty :

return (ip == null || ip.isEmpty());

Cela devrait également être une méthode distincte, vous pourriez appeler celle-ci hasProbableLength .

ip = ip.trim();
return ((ip.length() < 6) & (ip.length() > 15));

Ici, il y a beaucoup de choses qui se passent. J'essaierais de les séparer et peut-être d'éviter complètement l'utilisation de l'expression rationnelle.

try {
    Pattern pattern = Pattern.compile("^(?:(?: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]?)$");
    Matcher matcher = pattern.matcher(ip);
    return matcher.matches();
} catch (PatternSyntaxException ex) {
    return false;
}

Je commencerais par diviser la chaîne en points et je verrais si j'obtiens exactement quatre groupes. Appelez cette méthode divideIntoGroups

Je validerais ensuite chacun des groupes pour qu'ils aient une valeur comprise entre 0 et 255. Appelez cette méthode validateGroups

Maintenant que vous avez ceci, si vous voulez étendre cette classe pour rechercher également si l'IP est localhost ou si c'est une adresse de diffusion, il est assez facile de le faire. Voici ce que séparation des préoccupations vous donne.

Vous pouvez également savoir exactement laquelle de vos règles de validation a été enfreinte lors de la validation de la chaîne d'adresse IP. Ce que les expressions rationnelles ne peuvent pas faire.

3voto

Sean F Points 1782

La bibliothèque Java IPAddress le fera. La javadoc est disponible sur le lien. Disclaimer : Je suis le chef de projet.

Cette bibliothèque prend en charge IPv4 et IPv6 de manière transparente, de sorte que la validation de l'un ou l'autre fonctionne de la même manière ci-dessous, et elle prend également en charge les adresses IPC4 à longueur de préfixe CIDR. Elle supporte les formats plus inhabituels comme inet_aton (par exemple 10.8 a été mentionné dans une autre réponse ici).

Vérifier si une adresse est valide :

    String str = "1.2.3.4";
    IPAddressString addrString = new IPAddressString(str);
    try {
         IPAddress addr = addrString.toAddress();
         ...
    } catch(AddressStringException e) {
        //e.getMessage provides validation issue
    }

2voto

Shekhar Points 566

La façon la plus simple que j'ai trouvée pour vérifier qu'une adresse IP donnée est correctement en ipv4 est d'utiliser commons-validator-1.4.0.jar a class:--

org.apache.commons.validator.routines.InetAddressValidator

InetAddressValidator

Par exemple

InetAddressValidator inetValidator = InetAddressValidator.getInstance();
inetValidator.isValidInet4Address(yourIPAddress);

qui utilise cette simple regex :--

  "^(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})$";

2voto

ahmetyavuzoruc Points 21

Cela vous sera utile,

boolean isIPv4Address(String inputString) {
    String[] splitString = inputString.split("[.]");
    if (splitString.length > 4) {
        return false;
    }
    for (String string : splitString) {
        if (string.isEmpty()) {
            return false;
        }
        if (!string.matches("[0-9]{1,3}")) {
            return false;
        }
        int number = Integer.parseInt(string);
        if (!(number >= 0 && number <= 255)) {
            return false;
        }
    }
    return true;
}

1voto

Juan Andrés Points 808

Je vous suggère d'utiliser ce qui est disponible sur la plate-forme/le cadre que vous développez.

Si vous ne trouvez rien d'autre d'assez bon, vous pouvez simplement ajouter une expression rationnelle compilée à une classe d'aide. Par exemple, aquí C'est comme ça que fait le framework Android :

public static final Pattern IP_ADDRESS
    = Pattern.compile(
        "((25[0-5]|2[0-4][0-9]|[0-1][0-9]{2}|[1-9][0-9]|[1-9])\\.(25[0-5]|2[0-4]"
        + "[0-9]|[0-1][0-9]{2}|[1-9][0-9]|[1-9]|0)\\.(25[0-5]|2[0-4][0-9]|[0-1]"
        + "[0-9]{2}|[1-9][0-9]|[1-9]|0)\\.(25[0-5]|2[0-4][0-9]|[0-1][0-9]{2}"
        + "|[1-9][0-9]|[0-9]))");

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X