Как проверить Ip-адрес в android (Java) [duplicate]

Используйте system ("cls") , чтобы очистить экран:

  #include & lt; stdlib.h & gt;  int main (void) {system ("cls");  return 0;  }  
52
задан Sk8erPeter 17 April 2014 в 23:53
поделиться

16 ответов

Довольно просто с регулярным выражением (но обратите внимание, что это гораздо менее эффективно и гораздо труднее читать, чем ответ на вызов, который использует утилиту Apache Commons)

private static final Pattern PATTERN = Pattern.compile(
        "^(([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\.){3}([01]?\\d\\d?|2[0-4]\\d|25[0-5])$");

public static boolean validate(final String ip) {
    return PATTERN.matcher(ip).matches();
}

На основании сообщения Mkyong

79
ответ дан Pshemo 16 August 2018 в 14:22
поделиться
  • 1
    Ohhhh, его не работает на android.When запуск приложения он дает ошибку силы закрыть – iRunner 14 April 2011 в 19:06
  • 2
    вы можете показать LogCat – Necronet 14 April 2011 в 19:58
  • 3
    Как насчет странно-отформатированных IP-адресов, например 127.1 (что эквивалентно 127.0.0.1)? Как насчет IPv6? – krzysz00 29 November 2013 в 20:21
  • 4
    Одна из потенциальных проблем с вашим регулярным выражением состоит в том, что он, похоже, соответствует вещам, например 010.020.030.040, но это может быть проблематичным, поскольку числа, начинающиеся с 0, часто можно интерпретировать как восьмеричные числа. – Ron Maupin 31 July 2015 в 21:11
  • 5

Вы можете использовать эту функцию -

public static boolean validate(final String ip) {
    String PATTERN = "^((0|1\\d?\\d?|2[0-4]?\\d?|25[0-5]?|[3-9]\\d?)\\.){3}(0|1\\d?\\d?|2[0-4]?\\d?|25[0-5]?|[3-9]\\d?)$";

    return ip.matches(PATTERN);
}
5
ответ дан Akarshit Wal 16 August 2018 в 14:22
поделиться

Если вы не заботитесь о диапазоне, следующее выражение будет полезно для проверки с 1.1.1.1 до 999.999.999.999

"[1-9]{1,3}\\.[1-9]{1,3}\\.[1-9]{1,3}\\.[1-9]{1,3}"
1
ответ дан darkconeja 16 August 2018 в 14:22
поделиться

Регулярное выражение - наиболее эффективный способ решить эту проблему. Посмотрите на код ниже. Вдобавок, он также проверяет класс IP-адреса, в котором он принадлежит, и является ли он зарезервированным IP-адресом или нет

Pattern ipPattern;
int[] arr=new int[4];
int i=0;

//Method to check validity
 private String validateIpAddress(String ipAddress) {
      Matcher ipMatcher=ipPattern.matcher(ipAddress);

        //Condition to check input IP format
        if(ipMatcher.matches()) {       

           //Split input IP Address on basis of .
           String[] octate=ipAddress.split("[.]");     
           for(String x:octate) { 

              //Convert String number into integer
              arr[i]=Integer.parseInt(x);             
              i++;
         }

        //Check whether input is Class A IP Address or not
         if(arr[0]<=127) {                          
             if(arr[0]==0||arr[0]==127)
                 return(" is Reserved IP Address of Class A");
             else if(arr[1]==0&&arr[2]==0&&arr[3]==0)
                 return(" is Class A Network address");
             else if(arr[1]==255&&arr[2]==255&&arr[3]==255)
                 return( " is Class A Broadcast address");
             else 
                 return(" is valid IP Address of Class A");
         }

        //Check whether input is Class B IP Address or not
         else if(arr[0]>=128&&arr[0]<=191) {        
             if(arr[2]==0&&arr[3]==0)
                 return(" is Class B Network address");
             else if(arr[2]==255&&arr[3]==255)
                 return(" is Class B Broadcast address");
             else
                 return(" is valid IP Address of Class B");
         }

        //Check whether input is Class C IP Address or not
         else if(arr[0]>=192&&arr[0]<=223) {        
             if(arr[3]==0)
                 return(" is Class C Network address");
             else if(arr[3]==255)
                 return(" is Class C Broadcast address");
             else
                 return( " is valid IP Address of Class C");
        }

        //Check whether input is Class D IP Address or not
        else if(arr[0]>=224&&arr[0]<=239) {          
             return(" is Class D IP Address Reserved for multicasting");
        }

        //Execute if input is Class E IP Address
        else  {                                   
             return(" is Class E IP Address Reserved for Research and Development by DOD");
        }

    }

    //Input not matched with IP Address pattern
    else                                     
        return(" is Invalid IP Address");


}


public static void main(String[] args) {

    Scanner scan= new Scanner(System.in);
    System.out.println("Enter IP Address: ");

    //Input IP Address from user
    String ipAddress=scan.nextLine();  
    scan.close();
    IPAddress obj=new IPAddress();

    //Regex for IP Address
    obj.ipPattern=Pattern.compile("((([0-1]?\\d\\d?|2[0-4]\\d|25[0-5])\\.){3}([0-1]?\\d\\d?|2[0-4]\\d|25[0-5]))");

    //Display output
    System.out.println(ipAddress+ obj.validateIpAddress(ipAddress));

}
0
ответ дан Deepali Agg 16 August 2018 в 14:22
поделиться

Обратите внимание на класс IPAddressUtil OOTB, присутствующий в sun.net.util, который должен вам помочь.

0
ответ дан Girish 16 August 2018 в 14:22
поделиться
  • 1
    Не рекомендуется использовать пакеты sun.* - & gt; [Д0] подробно – buræquete 3 July 2018 в 15:43

Существует также недокументированный класс утилиты sun.net.util.IPAddressUtil, который вы не должны использовать , хотя это может быть полезно в быстрой одноразовой утилите:

boolean isIP = IPAddressUtil.isIPv4LiteralAddress(ipAddressString);

Внутри этого класса используется класс утилиты InetAddress для анализа IP-адресов.

Обратите внимание, что это вернет true для строк типа «123», которые технически являются действительными адресами IPv4 , только не в десятичной системе счисления.

9
ответ дан Jason C 16 August 2018 в 14:22
поделиться

Это для Android, тестирование для IPv4 и IPv6

Примечание: обычно используемый InetAddressUtils устарел. Используйте новые классы InetAddress

public static Boolean isIPv4Address(String address) {
    if (address.isEmpty()) {
        return false;
    }
    try {
        Object res = InetAddress.getByName(address);
        return res instanceof Inet4Address || res instanceof Inet6Address
    } catch (final UnknownHostException ex) {
        return false;
    }
}
3
ответ дан josliber 16 August 2018 в 14:22
поделиться
  • 1
    Я не думаю, что это делает то, что автор просил. Если вы перейдете в InetAddress.getByName («google.com»), вы получите правду, это связано с тем, что getByName разрешает имена DNS для IP-адреса. – Kevin 22 June 2017 в 14:47

Если это IP4, вы можете использовать регулярное выражение следующим образом:

^(2[0-5][0-5])|(1\\d\\d)|([1-9]?\\d)\\.){3}(2[0-5][0-5])|(1\\d\\d)|([1-9]?\\d)$.

2
ответ дан khachik 16 August 2018 в 14:22
поделиться

Существует так много способов добиться этого, но регулярное выражение более эффективно.

Посмотрите на код ниже:

public static void main(String[] args) {

    String ipStr1 = "255.245.188.123"; // valid IP address
    String ipStr2 = "255.245.188.273"; // invalid IP address - 273 is greater than 255

    validateIP(ipStr1);
    validateIP(ipStr2);
}

public static void validateIP(String ipStr) {
    String regex = "\\b((25[0–5]|2[0–4]\\d|[01]?\\d\\d?)(\\.)){3}(25[0–5]|2[0–4]\\d|[01]?\\d\\d?)\\b";
    System.out.println(ipStr + " is valid? " + Pattern.matches(regex, ipStr));
}
1
ответ дан Mulalo Madida 16 August 2018 в 14:22
поделиться

Библиотека Java IPAddress сделает это. Javadoc доступен по ссылке. Отказ от ответственности: я руководитель проекта.

Эта библиотека поддерживает прозрачность IPv4 и IPv6, поэтому проверка либо работает так же, как и ниже, и также поддерживает подсерии CIDR.

Проверьте, адрес действителен

    String str = "1.2.3.4";
    IPAddressString addrString = new IPAddressString(str);
    try {
         IPAddress addr = addrString.toAddress();
         ...
    } catch(AddressStringException e) {
        //e.getMessage provides validation issue
    }
2
ответ дан Sean F 16 August 2018 в 14:22
поделиться

Запишите подходящее регулярное выражение и подтвердите его. JVM имеют полную поддержку регулярных выражений.

1
ответ дан Thorbjørn Ravn Andersen 16 August 2018 в 14:22
поделиться
public static boolean isIpv4(String ipAddress) {
    if (ipAddress == null) {
        return false;
    }
    String ip = "^(1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|[1-9])\\."
            + "(1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|\\d)\\."
            + "(1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|\\d)\\."
            + "(1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|\\d)$";
    Pattern pattern = Pattern.compile(ip);
    Matcher matcher = pattern.matcher(ipAddress);
    return matcher.matches();
}
0
ответ дан veeson 16 August 2018 в 14:22
поделиться

Использовать InetAddresses.forString ()

Guava

try {
  InetAddresses.forString(ipStr);
} catch (IllegalArgumentException e) {
  ...
}
19
ответ дан wileyquixote 16 August 2018 в 14:22
поделиться

Попробуйте использовать служебный класс InetAddressValidator.

Документы здесь:

http://commons.apache.org/validator/apidocs/org/apache/commons/validator /routines/InetAddressValidator.html

Загрузить здесь:

http://commons.apache.org/validator/

44
ответ дан worpet 16 August 2018 в 14:22
поделиться
  • 1
    Всегда лучше использовать уже написанную утилиту для этих вещей – Jaime Hablutzel 25 July 2011 в 17:41

Вы можете использовать регулярное выражение, например:

(([0-1]?[0-9]{1,2}\.)|(2[0-4][0-9]\.)|(25[0-5]\.)){3}(([0-1]?[0-9]{1,2})|(2[0-4][0-9])|(25[0-5]))

Этот параметр подтверждает, что значения находятся в пределах диапазона.

Android поддерживает регулярные выражения. См. java.util.regex.Pattern .

class ValidateIPV4
{

   static private final String IPV4_REGEX = "(([0-1]?[0-9]{1,2}\\.)|(2[0-4][0-9]\\.)|(25[0-5]\\.)){3}(([0-1]?[0-9]{1,2})|(2[0-4][0-9])|(25[0-5]))";
   static private Pattern IPV4_PATTERN = Pattern.compile(IPV4_REGEX);

   public static boolean isValidIPV4(final String s)
   {          
      return IPV4_PATTERN.matcher(s).matches();
   }
}

Чтобы избежать повторной компиляции шаблона снова и снова, лучше всего поместить вызов Pattern.compile(), чтобы он выполнялся только один раз.

9
ответ дан Jason C 17 August 2018 в 06:10
поделиться
-1
ответ дан M Manzar AbBas 29 October 2018 в 12:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: