Java에서 IPv4 주소 유효성 검사
Java를 사용하여 IPv4 주소의 유효성을 검사하고 싶습니다. 점 10 진수 표기법을 사용하여 작성해야 하므로 3 개의 점 ( " .
")이 있어야하며 문자가 없어야하며 점 사이의 숫자는 유효한 범위에 있어야합니다. 어떻게해야합니까?
이 기능을 사용할 수 있습니다-
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);
}
정규 표현식으로 매우 간단합니다 (그러나 Apache Commons 유틸리티를 사용하는 worpet의 답변보다 훨씬 덜 효율적이고 읽기가 훨씬 어렵습니다)
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();
}
묵경 이후
InetAddressValidator 유틸리티 클래스를 사용해보십시오.
여기 문서 :
여기에서 다운로드 :
http://commons.apache.org/validator/
사용 구아바 의
InetAddresses.isInetAddress(ipStr)
다음과 같이 정규식을 사용할 수 있습니다.
(([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()
한 번만 실행되도록 호출하는 것이 가장 좋습니다 .
문서화되지 않은 유틸리티 클래스도있다 sun.net.util.IPAddressUtil
, 당신이 실제로 사용하지 말아야 가 빠른 일회성, 던져 - 멀리 유틸리티에 유용 할 수도 있지만이 :
boolean isIP = IPAddressUtil.isIPv4LiteralAddress(ipAddressString);
내부적으로 이것은 InetAddress
IP 주소를 구문 분석하는 데 사용 하는 유틸리티 클래스 입니다.
점 10 진수 표기법이 아니라 기술적으로 유효한 IPv4 주소 인 "123"과 같은 문자열에 대해 true를 반환합니다 .
이것은 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)$
.
IPAddress Java 라이브러리 가이를 수행합니다. 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은 정규식을 완벽하게 지원합니다.
이를 달성하는 방법은 여러 가지가 있지만 정규 표현식이 더 효율적입니다.
아래 코드를보십시오.
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));
}
정규식은이 문제를 해결하는 가장 효율적인 방법입니다. 아래 코드를보십시오. 유효성과 함께 자신이 속한 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));
}
sun.net.util 에있는 IPAddressUtil OOTB 클래스를 살펴보십시오 . 도움이 될 것입니다.
범위에 신경 쓰지 않는다면 다음 표현식이 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 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 주소를 두 줄로 가져옵니다. 숫자 범위를 얻기 위해 정규식이 어떻게 작동하는지 코드의 주석 세션을 확인하십시오.
public class regexTest {
public static void main(String[] args) {
String IP = "255.001.001.255";
System.out.println(IP.matches(new MyRegex().pattern));
}
}
/*
* /d - stands for any number between 0 to 9
* /d{1,2} - preceding number that 0 to 9 here , can be of 1 digit to 2 digit . so minimum 0 and maximum 99
* | this stands for or operator
*
* () this is applied on a group to get the single value of outcome
* (0|1)\d{2} = first digit is either 0 or 1 and other two digits can be any number between ( 0 to 9)
* 2[0-4]\d - first digit is 2 , second digit can be between 0 to 4 and last digit can be 0 to 9
* 25[0-5] - first two digit will be 25 and last digit will be between 0 to 5
*
* */
class MyRegex {
String zeroTo255 = "(\\d{1,2}|(0|1)\\d{2}|2[0-4]\\d|25[0-5])";
public String pattern = zeroTo255 + "\\." + zeroTo255 + "\\." + zeroTo255 + "\\." + zeroTo255;;
}
public void setIpAddress(String ipAddress) {
if(ipAddress.matches("^(?:(?: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]?)$")) //regular expression for ipv4
this.ipAddress = ipAddress;
else
System.out.println("incorrect IpAddress");
}
참고 URL : https://stackoverflow.com/questions/5667371/validate-ipv4-address-in-java
'Nice programing' 카테고리의 다른 글
Ruby에서 메모리 누수의 원인 찾기 (0) | 2020.12.25 |
---|---|
FullCalendar 헤더 버튼이 없습니다. (0) | 2020.12.13 |
iOS 7에서 UITextView 링크 감지 (0) | 2020.12.13 |
프로젝트에서 유효한 GoogleService-Info.plist를 찾을 수 없습니다. (0) | 2020.12.13 |
'git rebase -i'를 사용하여 분기의 모든 변경 사항을 리베이스하려면 어떻게해야합니까? (0) | 2020.12.13 |