자바 정규식에서는 하나의 문자 범위에서 다른 범위를 빼서 새로운 범위를 만들 수 있습니다. 이를 차집합(Subtraction)이라고 하며, 문자 클래스의 두 가지 기능인 부정(Negation)과 교집합(Intersection)을 조합하여 구현합니다.
차집합의 동작 원리
예를 들어, 범위 [a-l]과 [^e-h]의 교집합을 구하면, a부터 l까지의 문자 중에서 e부터 h까지의 문자를 제외한 결과, 즉 a, b, c, d, i, j, k, l에 해당하는 새로운 범위가 만들어집니다.
문법은 다음과 같습니다.
[a-l&&[^e-h]]
[a-l]: a부터 l까지의 전체 범위[^e-h]: e부터 h까지를 제외한 모든 문자 (부정)&&: 두 문자 클래스의 교집합을 의미하는 연산자
예제 코드
아래 예제는 사용자로부터 입력받은 문자열에서 위의 차집합 패턴과 일치하는 문자를 찾아 출력하고, 일치하는 문자의 개수를 세어 보여줍니다.
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegexExample1 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("Enter input text: ");
String input = sc.nextLine();
// 차집합 패턴: a~l 범위에서 e~h 제외
String regex = "[a-l&&[^e-h]]";
// Pattern 객체 생성
Pattern pattern = Pattern.compile(regex);
// 컴파일된 패턴으로 입력 문자열 매칭
Matcher matcher = pattern.matcher(input);
int count = 0;
while (matcher.find()) {
count++;
System.out.print(matcher.group() + " ");
}
System.out.println("Number of matched characters: " + count);
}
}실행 결과
Enter input text: abcdefghijklmnopq a b c d i j k l Number of matched characters: 8
결과 분석
입력 문자열 abcdefghijklmnopq에서 패턴 [a-l&&[^e-h]]와 일치하는 문자는 총 8개입니다.
- a부터 l 사이의 문자만 대상이 되므로 m, n, o, p, q는 제외됩니다.
- 같은 이유로 e, f, g, h도 부정 조건에 의해 제외됩니다.
- 따라서 최종적으로 a b c d i j k l의 8개 문자가 출력됩니다.
이처럼 차집합 기능을 활용하면 복잡한 문자 필터링 조건을 간결한 정규식 하나로 표현할 수 있어 코드의 가독성과 유지보수성이 크게 향상됩니다.