[JAVA] Bibliothek, um zu überprüfen, ob es sich um eine Zeichenfolge im IPv4-Format handelt

Überblick

Ich habe eine Bibliothek erstellt, die prüft, ob die Zeichenfolge im IPv4-Format vorliegt, und sie in Inet4Address konvertiert. Außerdem sind Zeichenfolgen im IPv4-Format mit höheren Zahlen und Symbolen (z. B. 192.168.1.1) zulässig.

Ursprünglich wurde es mit einer einfachen Methode unter Verwendung von Inet4Address.getByName () beurteilt, aber ich habe eine Bibliothek erstellt, weil ein Problem mit einer bestimmten Spezifikation (am Ende aufgeführt) von getByName aufgetreten ist.

Bibliothek

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

/**IPv4-Dienstprogrammklasse*/
public abstract class Ipv4AddressUtil {
    /**Maximale Anzahl von Oktetten*/
    private static final int OCTETS_LENTGH = 4;
    /**Maximale Anzahl von Oktettwerten*/
    private static final int MAX_OCTET_VALUE = 255;
    /**Minimaler Oktettwert*/
    private static final int MIN_OCTET_VALUE = 0;
    /**IPv4-Muster*/
    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]))");

    /**
     *Legt fest, ob die angegebene Zeichenfolge im Format IP-Adresse v4 vorliegt.
     *In den folgenden Fällen wird es als IP-Adresse v4-Format betrachtet.
     *- Bestehend aus 4 Zahlenreihen mit Punkten als Begrenzer.
     *・ Zahlen sind Werte mit 3 oder weniger Ziffern im Bereich von 0 bis 255.(Keine Polsterung erlaubt)。
     *
     * @param v Beurteilungszeichenfolge
     * @Rückgabe true für das Format der IP-Adresse v4
     */
    public static boolean isIpv4Address(String v) {
        return isIpv4Address(v, true);
    }

    /**
     *Legt fest, ob die angegebene Zeichenfolge im Format IP-Adresse v4 vorliegt.
     *In den folgenden Fällen wird es als IP-Adresse v4-Format betrachtet.
     *- Bestehend aus 4 Zahlenreihen mit Punkten als Begrenzer.
     *・ Zahlen sind Werte mit 3 oder weniger Ziffern im Bereich von 0 bis 255.(Keine Polsterung erlaubt)。
     *
     * @param v Beurteilungszeichenfolge
     * @param allowEm Ermöglicht den vollen Winkel.
     * @Rückgabe true für das Format der IP-Adresse 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();
        }
    }

    /**
     *Analysiert die angegebene Zeichenfolge als Inet4Address.
     * @param v Zu analysierende Zeichenfolge
     * @param allowEm Ermöglicht den vollen Winkel.
     * @Inet4Address wird durch das Argument der Rückgabezeichenfolge dargestellt
     * @löst eine IllegalArgumentException aus, wenn die Zeichenfolge nicht im Format IP-Adresse v4 vorliegt
     */
    public static Inet4Address parseInet4Address(String v, boolean allowEm) throws IllegalArgumentException {
        if (!isIpv4Address(v, allowEm))
            throw new IllegalArgumentException("Die zu analysierende Zeichenfolge hat nicht das Format IP-Adresse v4.");


        Inet4Address returnvalue = null;
        try {
            returnvalue = (Inet4Address) Inet4Address.getByName(v.toLowerCase().replaceAll(".", "."));
        } catch (UnknownHostException e) {} //UnknownHostException tritt nicht auf, da das Format der IP-Adresse v4 bestätigt wurde.
        return returnvalue;
    }
}

Es wird auf dem Code von Herrn Uepan basieren. Vielen Dank.

[Java] [Beispielcode] Überprüfen Sie, ob es sich um ein IP-Adressformat handelt. - Ich werde den Java-Beispielcode http://javasampleokiba.blog.fc2.com/blog-entry-26.html eingeben

Beispielcode

https://paiza.io/projects/uU5C6g6Mb4RXBm1eAE4VoQ

Verhalten von Inet4Address.getByName ()

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

Der Hostname ist ein Computername wie "java.sun.com" oder eine Textdarstellung seiner IP-Adresse. Wenn eine Literal-IP-Adresse angegeben wird, wird nur die Gültigkeit des Adressformats überprüft.

Eine Spezifikation, die die Loopback-Schnittstellenadresse (localhost / 127.0.0.1) zurückgibt, wenn null oder ein leeres Zeichen angegeben wird. (Ich wünschte, ich könnte einfach eine UnknownHostException auslösen ...) Außerdem müssen alle IPv4-Zeichenfolgen halb so breit sein. Beispielcode: https://paiza.io/projects/TA90Yho1C0BhGwIqwecACQ

Referenz

Überprüfung des IP-Adressformats | Hacknote http://hacknote.jp/archives/26988/ Überprüfen Sie, ob die eingegebenen Zeichen IP-Adressen sind. Geben Sie sie auf dem Konsolenbildschirm ein. Java | Sagen Sie es mir! Goo https://oshiete.goo.ne.jp/qa/5572521.html

Recommended Posts

Bibliothek, um zu überprüfen, ob es sich um eine Zeichenfolge im IPv4-Format handelt
Rufen Sie den Typ eines Elements eines Arrays ab, um festzustellen, ob es sich um ein Array handelt
So überprüfen Sie, ob eine Instanzvariable in einer Ruby-Klasse definiert ist
Überprüfen Sie, ob eine Zeichenfolge ohne Verwendung von Integer # parseInt in int konvertiert werden kann
Es funktioniert nicht, wenn der Map-Schlüssel ein Array ist
Ist das String # -Format (String, Object ...) wirklich langsam?
So fügen Sie eine externe Bibliothek ein
Festlegen eines Alias, da es schwierig ist, jedes Mal "Docker-Compose" einzugeben
[Java] Überprüfen Sie, ob die Zeichenfolge nur aus Leerzeichen besteht (= Leerzeichen)
Ist es möglich, die Bibliothek (aar) in die Android-Bibliothek (aar) zu stellen und zu verwenden?
[Java] Ist es nicht erforderlich, "Identität" bei der Implementierung der equals () -Methode zu überprüfen?