정규식 패턴 살펴보기
Java에서 길이가 짝수이면서 10자 이상인 16진수를 검증하려면 다음 정규식을 사용할 수 있습니다.
^(?=.{10,255}$)(?:0x)?\p{XDigit}{2}(?:\p{XDigit}{2})*$
패턴을 이루는 각 요소의 역할은 다음과 같습니다.
^ − 문자열의 시작을 나타냅니다.
(?=.{10,255}$) − 전방 탐색(lookahead)으로, 전체 문자열의 길이가 최소 10자 이상 255자 이하인지 미리 확인합니다.
(?:0x)? − '0x' 접두사가 있어도 없어도 매칭이 가능하도록 허용합니다.
\p{XDigit}{2} − 두 개의 16진수 문자(0~9, a~f, A~F)를 의미합니다.
(?:\p{XDigit}{2})* − 두 자리씩 묶인 16진수 그룹이 0개 이상 반복됨을 나타냅니다. 이 구조 덕분에 매칭되는 문자열의 길이는 항상 짝수가 됩니다.
$ − 문자열의 끝을 나타냅니다.
정리하면, 이 정규식은 0x 접두사의 유무와 관계없이 오직 16진수 문자로만 구성되고 전체 길이가 10자 이상인 짝수 길이의 문자열만 유효한 것으로 판별합니다.
예제 1: 여러 입력값 한 번에 검증하기
Scanner로 16진수 문자열 5개를 입력받은 뒤, Pattern과 Matcher 객체를 사용해 각 값이 정규식에 부합하는지 확인하는 예제입니다.
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class JavaExample51 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String nums[] = new String[5];
for(int i=0; i<nums.length; i++){
System.out.println("Enter a hexa-decimal number: ");
nums[i] = sc.nextLine();
}
// 10자 이상 짝수 길이의 16진수를 검증하는 정규식
String regex = "^(?=.{10,255}$)(?:0x)?\\p{XDigit}{2}(?:\\p{XDigit}{2})*$";
// Pattern 객체 생성
Pattern pattern = Pattern.compile(regex);
for (String hex : nums) {
// Matcher 객체 생성
Matcher matcher = pattern.matcher(hex);
if(matcher.find()) {
System.out.println(hex + " is valid");
} else {
System.out.println(hex + " is not valid");
}
}
}
}
실행 결과
Enter a hexa-decimal number: 0x1234567890 Enter a hexa-decimal number: 123456789 Enter a hexa-decimal number: 123456789012 Enter a hexa-decimal number: sfdgdf35364 Enter a hexa-decimal number: $@%#BV#* 0x1234567890 is valid 123456789 is not valid 123456789012 is valid sfdgdf35364 is not valid $@%#BV#* is not valid
실행 결과를 보면 0x1234567890(접두사 포함 12자)과 123456789012(12자)는 길이와 형식 조건을 모두 충족하므로 유효한 것으로 판별됩니다. 반면 123456789는 9자라 길이 조건을 만족하지 못하고, sfdgdf35364는 16진수가 아닌 문자(s, g 등)가 포함되어 있으며, $@%#BV#*는 특수문자를 포함하고 있어 모두 유효하지 않은 것으로 처리됩니다.
예제 2: 단일 입력값 검증하기
String 클래스의 matches() 메서드를 사용하면 Pattern 객체를 직접 생성하지 않고도 더 간결하게 검증할 수 있습니다.
import java.util.Scanner;
public class JavaExample {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("Enter a hexa-decimal number: ");
String name = sc.nextLine();
String regex = "^(?=.{10,255}$)(?:0x)?\\p{XDigit}{2}(?:\\p{XDigit}{2})*$";
boolean result = name.matches(regex);
if(result) {
System.out.println("Given number is valid");
} else {
System.out.println("Given number is not valid");
}
}
}
실행 결과 1
Enter a hexa-decimal number: 0x1234567890 Given number is valid
실행 결과 2
Enter a hexa-decimal number: 024587545 Given number is not valid
024587545는 총 9자로, 최소 10자라는 길이 조건과 짝수 길이 조건을 모두 만족하지 못하기 때문에 유효하지 않은 것으로 판별됩니다.
마무리
이번 글에서는 길이가 짝수이고 10자 이상인 16진수를 검증하는 Java 정규식을 살펴보았습니다. 핵심은 (?=.{10,255}$)로 길이 범위를 제한하고, \p{XDigit}{2} 단위로 두 자리씩 묶어 반복함으로써 짝수 길이를 강제한다는 점입니다. 필요에 따라 최소·최대 길이 값을 조정하면 다양한 형식의 16진수 검증 로직으로 손쉽게 응용할 수 있습니다.