Java 정규식에서 하위 표현식이자 메타문자인 [^...]는 대괄호 안에 포함되지 않은 임의의 단일 문자와 일치시키는 역할을 합니다. 즉, 대괄호 내부에 나열된 문자들을 제외한 모든 문자를 매칭 대상으로 삼는 부정 문자 클래스(negated character class)입니다.
예제 1: 특정 문자를 제외한 문자 세기
다음 예제에서는 입력 문자열에서 'h', 'w', 't', 'y', 'o', 'u', 'p', 'i'에 해당하지 않는 문자가 몇 개 있는지 세어 봅니다.
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class SpecifiedCharacters {
public static void main( String args[] ) {
String regex = "[^hwtyoupi]";
String input = "Hi how are you welcome to Tutorialspoint";
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(input);
int count = 0;
while(m.find()) {
count++;
}
System.out.println("매칭된 문자 수: "+count);
}
}실행 결과
매칭된 문자 수: 21
예제 2: 영문 알파벳이 포함되지 않은 문자열 찾기
아래 Java 프로그램은 사용자로부터 5개의 문자열을 입력받은 후, 그중 영문 알파벳(a~z, A~Z)을 하나도 포함하지 않는 문자열만 골라 출력합니다. 정규식 ^.*[^a-zA-Z].*$는 전체 문자열 중 최소 한 글자 이상이 알파벳이 아닌 경우에 매칭됩니다.
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegexExample {
public static void main( String args[] ) {
String regex = "^.*[^a-zA-Z].*$";
Scanner sc = new Scanner(System.in);
System.out.println("5개의 입력 문자열을 입력하세요: ");
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("영문 알파벳을 포함하지 않는 문자열: ");
for(int i=0; i<5;i++) {
// Matcher 객체 생성
Matcher m = p.matcher(input[i]);
if(m.find()) {
System.out.println(m.group());
}
}
}
}실행 결과
5개의 입력 문자열을 입력하세요: 1234*5 *&% sample test data23 영문 알파벳을 포함하지 않는 문자열: 1234*5 *&%
핵심 정리
[^...] 구문은 대괄호 안의 문자 집합을 부정하는 방식으로 동작하며, 데이터 유효성 검사나 특정 문자 필터링 등 다양한 상황에서 유용하게 활용할 수 있습니다. 위 예제처럼 숫자나 특수문자만으로 구성된 입력값을 걸러내는 작업에도 손쉽게 적용할 수 있습니다.