[JAVA] Bibliothèque pour vérifier s'il s'agit d'une chaîne au format IPv4

Aperçu

J'ai créé une bibliothèque qui vérifie si la chaîne de caractères est au format IPv4 et la convertit en Inet4Address. De plus, les chaînes de caractères au format IPv4 de nombres et de symboles supérieurs (par exemple 192.168.1.1) sont autorisées.

À l'origine, il a été jugé par une méthode simple utilisant Inet4Address.getByName (), mais j'ai créé une bibliothèque car il y avait un problème avec une certaine spécification (répertoriée à la fin) de getByName.

Bibliothèque

import java.net.Inet4Address;
import java.net.UnknownHostException;
import java.util.regex.Pattern;

/**Classe d'utilitaire IPv4*/
public abstract class Ipv4AddressUtil {
    /**Nombre maximum d'octets*/
    private static final int OCTETS_LENTGH = 4;
    /**Nombre maximum de valeurs d'octet*/
    private static final int MAX_OCTET_VALUE = 255;
    /**Valeur d'octet minimum*/
    private static final int MIN_OCTET_VALUE = 0;
    /**Modèle IPv4*/
    private static final Pattern V4_FORMAT = Pattern
            .compile("((([01]?\\d{1,2})|(2[0-4]\\d)|(25[0-5]))\\.){3}(([01]?\\d{1,2})|(2[0-4]\\d)|(25[0-5]))");

    /**
     *Détermine si la chaîne spécifiée est au format d'adresse IP v4.
     *Il est considéré comme un format d'adresse IP v4 dans les cas suivants.
     *-Composé de 4 ensembles de nombres, avec des points comme délimiteurs.
     *・ Les nombres sont des valeurs de 3 chiffres ou moins comprises entre 0 et 255.(Aucun rembourrage autorisé)。
     *
     * @param v Chaîne de caractères de jugement
     * @retourne true pour le format d'adresse IP v4
     */
    public static boolean isIpv4Address(String v) {
        return isIpv4Address(v, true);
    }

    /**
     *Détermine si la chaîne spécifiée est au format d'adresse IP v4.
     *Il est considéré comme un format d'adresse IP v4 dans les cas suivants.
     *-Composé de 4 ensembles de nombres, avec des points comme délimiteurs.
     *・ Les nombres sont des valeurs de 3 chiffres ou moins comprises entre 0 et 255.(Aucun rembourrage autorisé)。
     *
     * @param v Chaîne de caractères de jugement
     * @param allowEm Permet un angle complet.
     * @retourne true pour le format d'adresse IP v4
     */
    public static boolean isIpv4Address(String v, boolean allowEm) {
        if (v == null || v.isEmpty()) {
            return false;
        }

        if (allowEm) {
            String[] octets = v.toLowerCase().replaceAll(".", ".").split("\\.");
            if (octets.length != OCTETS_LENTGH) {
                return false;
            }
            for (String octet : octets) {
                try {
                    int b = Integer.parseInt(octet);

                    if (b < MIN_OCTET_VALUE || MAX_OCTET_VALUE < b)
                        return false;
                } catch (NumberFormatException e) {
                    return false;
                }
            }
            return true;
        } else {
            return V4_FORMAT.matcher(v).matches();
        }
    }

    /**
     *Analyse la chaîne spécifiée comme Inet4Address.
     * @param v Chaîne de caractères à analyser
     * @param allowEm Permet un angle complet.
     * @Inet4Address représenté par l'argument de la chaîne de retour
     * @lève IllegalArgumentException si la chaîne n'est pas au format d'adresse IP v4
     */
    public static Inet4Address parseInet4Address(String v, boolean allowEm) throws IllegalArgumentException {
        if (!isIpv4Address(v, allowEm))
            throw new IllegalArgumentException("La chaîne à analyser n'est pas au format d'adresse IP v4.");


        Inet4Address returnvalue = null;
        try {
            returnvalue = (Inet4Address) Inet4Address.getByName(v.toLowerCase().replaceAll(".", "."));
        } catch (UnknownHostException e) {} //UnknownHostException ne se produit pas car le format de l'adresse IP v4 a été confirmé.
        return returnvalue;
    }
}

Il sera basé sur le code de M. Uepan. Merci beaucoup.

[Java] [Exemple de code] Vérifiez s'il est au format d'adresse IP - Je mettrai l'exemple de code Java http://javasampleokiba.blog.fc2.com/blog-entry-26.html

Exemple de code

https://paiza.io/projects/uU5C6g6Mb4RXBm1eAE4VoQ

Comportement de Inet4Address.getByName ()

InetAddress (Java Platform SE 6) https://docs.oracle.com/javase/jp/6/api/java/net/InetAddress.html#getByName(java.lang.String)

Le nom d'hôte est un nom de machine tel que "java.sun.com" ou une représentation textuelle de son adresse IP. Si une adresse IP littérale est spécifiée, seule la validité du format d'adresse est vérifiée.

Une spécification qui renvoie l'adresse de l'interface de bouclage (localhost / 127.0.0.1) si nul ou un caractère vide est donné. (Je souhaite que je puisse simplement lever une UnknownHostException ...) De plus, toutes les chaînes IPv4 doivent avoir une demi-largeur. Exemple de code: https://paiza.io/projects/TA90Yho1C0BhGwIqwecACQ

référence

Vérification du format de l'adresse IP | Hacknote http://hacknote.jp/archives/26988/ Vérifiez si les caractères saisis sont des adresses IP - Entrez depuis l'écran de la console - Java | Dites-moi! Goo https://oshiete.goo.ne.jp/qa/5572521.html

Recommended Posts

Bibliothèque pour vérifier s'il s'agit d'une chaîne au format IPv4
Obtenez le type d'un élément d'un tableau pour déterminer s'il s'agit d'un tableau
Comment vérifier si une variable d'instance est définie dans une classe Ruby
Vérifiez si une chaîne peut être convertie en int sans utiliser Integer # parseInt
Cela ne fonctionne pas si la clé Map est un tableau
Le format String # (String, Object ...) est-il vraiment lent?
Comment insérer une bibliothèque externe
Définition d'un alias car il est difficile de saisir "docker-compose" à chaque fois
[Java] Vérifiez si la chaîne de caractères est composée uniquement de blancs (= Vierge)
Est-il possible de mettre la bibliothèque (aar) dans la bibliothèque Android (aar) et de l'utiliser?
[Java] Est-il inutile de vérifier "l'identité" dans l'implémentation de la méthode equals ()?