Computer >> 컴퓨터 >  >> 프로그래밍 >> Java

Java에서 길이가 짝수이고 10자 이상인 16진수를 검증하는 정규식


정규식 패턴 살펴보기

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진수 검증 로직으로 손쉽게 응용할 수 있습니다.