POSIX 문자 클래스 \p{XDigit}는 16진수(hexadecimal) 문자를 매칭하는 정규 표현식 패턴입니다. 이 클래스는 다음과 같은 문자 집합과 동일하게 동작합니다.
[0-9a-fA-F]
즉, 숫자 0부터 9까지와 영문자 a~f, A~F 사이의 문자가 모두 해당됩니다.
예제 1: 입력 문자열에서 16진수 문자 개수 세기
아래 예제는 사용자로부터 문자열을 입력받아 그 안에 포함된 16진수 문자의 개수를 세는 프로그램입니다.
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class SpaceCharacters {
public static void main(String args[]) {
// 사용자로부터 문자열 입력 받기
System.out.println("Enter a string");
Scanner sc = new Scanner(System.in);
String input = sc.nextLine();
// 정규 표현식
String regex = "[\\p{XDigit}]";
// 정규 표현식 컴파일
Pattern pattern = Pattern.compile(regex);
// Matcher 객체 생성
Matcher matcher = pattern.matcher(input);
int count = 0;
while (matcher.find()) {
count++;
}
System.out.println("Number of hexadecimal characters: " + count);
}
}
실행 결과
Enter a string Bb12\tc! Number of hexadecimal characters: 5
입력된 문자열에서 B, b, 1, 2, c 총 5개의 문자가 16진수 범위에 속하므로 결과는 5가 됩니다.
예제 2: 16진수 문자를 포함하는 문자열 필터링
다음 예제는 여러 개의 입력 문자열 중에서 16진수 문자를 하나라도 포함하는 문자열만 골라 출력합니다.
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Example {
public static void main(String args[]) {
// 16진수 문자를 포함하는지 검사하는 정규 표현식
String regex = "^.*\\p{XDigit}.*$";
// 입력 데이터 받기
Scanner sc = new Scanner(System.in);
System.out.println("Enter 5 input strings: ");
String input[] = new String[5];
for (int i = 0; i < 5; i++) {
input[i] = sc.nextLine();
}
// Pattern 객체 생성
Pattern p = Pattern.compile(regex);
System.out.println("Strings with hexa decimal characters: ");
for (int i = 0; i < 5; i++) {
// Matcher 객체 생성
Matcher m = p.matcher(input[i]);
if (m.matches()) {
System.out.println(m.group());
}
}
}
}
실행 결과
Enter 5 input strings: sample 123 xyz @## DEF01 Strings with hexadecimal characters: sample 123 DEF01
sample, 123, DEF01은 각각 s, e, m 등 16진수 범위(a~f)에 포함되는 알파벳이나 숫자를 담고 있어 조건을 만족하지만, xyz와 @##는 16진수 문자가 전혀 없기 때문에 제외됩니다.
정리
\p{XDigit}는 색상 코드(#FF5733), 메모리 주소, 해시 값처럼 16진수 형식의 데이터를 검증할 때 유용하게 활용할 수 있습니다. 대소문자를 모두 지원하므로 별도의 플래그 설정 없이 간편하게 사용할 수 있다는 점도 장점입니다.