문자 클래스(Character Class)로 문자 범위 매칭하기
Java 정규식에서 특정 두 문자 사이의 모든 문자를 일치시키고 싶다면, 즉 일련의 문자 중 지정된 범위에 속한 문자들을 찾고 싶다면 문자 클래스(character class)를 사용하면 됩니다.
[a-z]
대괄호 안에 하이픈(-)으로 시작 문자와 끝 문자를 연결해 표기하면 해당 범위에 포함된 모든 문자와 일치합니다.
주요 활용 예시
- [a-zA-Z] — 영어 알파벳 대소문자 전체(모든 영문자)를 허용합니다.
- [0-9&&[^35]] — 숫자 0~9 중에서 3과 5를 제외한 나머지 숫자만 허용합니다. &&는 교집합(intersection) 연산으로, 두 조건을 동시에 만족하는 문자만 매칭됩니다.
예제 1: 알파벳과 숫자로만 구성된 문자열 검증하기
아래 예제는 입력받은 문자열이 영문자와 숫자로만 이루어져 있는지 정규식 ^[a-zA-Z0-9]*$로 검사합니다.
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Example {
public static void main(String args[]) {
// 사용자로부터 문자열 입력 받기
System.out.println("Enter a String");
Scanner sc = new Scanner(System.in);
String input = sc.nextLine();
String regex = "^[a-zA-Z0-9]*$";
// 정규식 컴파일
Pattern pattern = Pattern.compile(regex);
// Matcher 객체 생성
Matcher matcher = pattern.matcher(input);
if(matcher.matches()) {
System.out.println("Match occurred");
} else {
System.out.println("Match not occurred");
}
}
}실행 결과 1
Enter a String Hello Match occurred
입력값이 'Hello'처럼 알파벳만 포함하고 있으므로 정규식 패턴과 일치하여 매칭에 성공했습니다.
실행 결과 2
Enter a String sample# Match not occurred
입력값 'sample#'에는 알파벳과 숫자 외의 특수문자 '#'가 포함되어 있으므로 매칭에 실패합니다.
예제 2: 특정 숫자를 제외한 숫자 세기
이번 예제에서는 정규식 [0-9&&[^35]]를 사용해 입력 문자열에서 3과 5를 제외한 숫자가 몇 번 등장하는지 세어봅니다.
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Example {
public static void main(String args[]) {
// 사용자로부터 문자열 입력 받기
System.out.println("Enter a String");
Scanner sc = new Scanner(System.in);
String input = sc.nextLine();
String regex = "[0-9&&[^35]]";
// 정규식 컴파일
Pattern pattern = Pattern.compile(regex);
// Matcher 객체 생성
Matcher matcher = pattern.matcher(input);
int count = 0;
while(matcher.find()) {
count++;
}
System.out.println("Occurrences :"+count);
}
}실행 결과
Enter a String 111223333555689 Occurrences :8
입력값 '111223333555689'에서 3은 네 개, 5는 세 개로 총 7개를 제외하면 나머지 숫자(1×3개, 2×2개, 6, 8, 9)는 8개입니다. 따라서 결과가 'Occurrences :8'로 출력되는 것을 확인할 수 있습니다.
정리
- 문자 클래스 [시작-끝] 형태로 문자 범위를 지정할 수 있습니다.
- 여러 범위를 합쳐 쓰면([a-zA-Z0-9]) 대소문자 알파벳과 숫자를 한 번에 처리할 수 있습니다.
- && 연산자와 ^ 기호를 조합하면([0-9&&[^35]]) 특정 문자를 제외한 교집합 매칭도 가능합니다.