Проверка IPv4-адреса на Java
Я хочу проверить IPv4-адрес с помощью Java. Он должен быть написан с помощью точечно-десятичной нотации, поэтому он должен иметь 3 точки ("."), никаких символов, чисел между точками, и числа должны быть в допустимом диапазоне. Как это должно быть сделано?
16 ответов:
довольно просто с регулярным выражением (но обратите внимание, что это гораздо менее эффективно и гораздо труднее читать, чем ответ worpet, который использует утилиту 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(); }на основе post Mkyong
использовать гуавыС InetAddresses.forString ()
try { InetAddresses.forString(ipStr); } catch (IllegalArgumentException e) { ... }
вы можете использовать регулярное выражение вроде этого:
(([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.утиль.регулярное выражение.Шаблон.
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()вызовите так, чтобы он выполнялся только один раз.
существует также недокументированный служебный класс
sun.net.util.IPAddressUtil, который вы не должны использовать, хотя это может быть полезно в быстрой одноразовой, выброшенной утилите:boolean isIP = IPAddressUtil.isIPv4LiteralAddress(ipAddressString);внутренне, это служебный класс
InetAddressиспользуется для анализа IP-адресов.обратите внимание, что это вернет true для строк типа "123", которые технически являются допустимые адреса IPv4, только не в десятичной системе счисления.
вы можете использовать эту функцию -
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); }
Это для 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; } }
если это IP4, вы можете использовать регулярное выражение следующим образом:
^(2[0-5][0-5])|(1\d\d)|([1-9]?\d)\.){3}(2[0-5][0-5])|(1\d\d)|([1-9]?\d)$.
библиотека 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 }
напишите подходящее регулярное выражение и проверьте его на это. JVM имеют полную поддержку регулярных выражений.
Если вы не заботитесь о диапазоне, следующее выражение будет полезен для проверки от 1.1.1.1 до 999.999.999.999
"[1-9]{1,3}\.[1-9]{1,3}\.[1-9]{1,3}\.[1-9]{1,3}"
есть так много способов, чтобы добиться этого,но регулярное выражение является более эффективным.
посмотрите на код ниже:
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)); }
пожалуйста, посмотрите в IPAddressUtil класс обновилась настоящее время в солнце.чистая.утиль ,которые должны помочь вам.
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(); }
регулярное выражение является наиболее эффективным способом решения этой проблемы. Посмотрите на код ниже. Наряду с действительностью, он также проверяет класс 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)); }
общественного недействительными setIpAddress(строку IP-адрес) { если(IP-адрес.спички ("^(?:(?: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]?) $ ")) / / регулярное выражение для ipv4 этот.свойство IpAddress = IP-адрес; еще Система.из.println ("неверный IpAddress"); }
Comments