영문 알파벳(대소문자 모두)과 숫자(0~9)를 제외한 나머지 모든 문자는 단어가 아닌 문자(non-word character)로 간주됩니다. Java 정규식에서는 메타 문자 \W를 사용하면 이러한 문자들을 간편하게 매칭할 수 있습니다.
메타 문자 \W란?
\W는 [^a-zA-Z0-9_]와 같은 의미로, 알파벳·숫자·밑줄(_)을 제외한 특수 기호나 공백 등에 해당합니다. 반대로 소문자 \w는 단어 문자(word character), 즉 알파벳과 숫자, 밑줄을 매칭하는 데 사용됩니다.
예제 1: Pattern과 Matcher 클래스 활용하기
아래 예제는 Pattern과 Matcher 클래스를 사용해 입력 문자열이 정확히 5개의 단어가 아닌 문자(^\W{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 = "^\\W{5}";
// 정규식 컴파일
Pattern pattern = Pattern.compile(regex);
// Matcher 객체 생성
Matcher matcher = pattern.matcher(input);
if(matcher.find()) {
System.out.println("Match occurred");
} else {
System.out.println("Match not occurred");
}
}
}실행 결과 1
입력값이 모두 특수 문자인 경우 정상적으로 매칭됩니다.
Enter a String *&&^# Match occurred
실행 결과 2
입력값이 일반 알파벳으로만 구성된 경우 매칭되지 않습니다.
Enter a String hello Match not occurred
예제 2: String.matches() 메서드 활용하기
String 클래스가 기본 제공하는 matches() 메서드를 사용하면 더 간결하게 구현할 수 있습니다. 아래 예제는 전체 문자열이 0개 이상의 단어가 아닌 문자(\W*)로만 이루어져 있는지 검사합니다.
import java.util.Scanner;
public class RegexExample {
public static void main( String args[] ) {
String regex = "\\W*";
System.out.println("Enter input value: ");
Scanner sc = new Scanner(System.in);
String input = sc.nextLine();
boolean bool = input.matches(regex);
if(bool) {
System.out.println("match occurred");
} else {
System.out.println("match not occurred");
}
}
}실행 결과
Enter input value: #*** match occurred
정리
단어가 아닌 문자를 매칭할 때는 메타 문자 \W를 사용하며, 개수를 지정하려면 {n}, 반복 허용 시에는 * 또는 + 한정자와 함께 조합하면 됩니다. 복잡한 패턴 처리에는 Pattern/Matcher 클래스가 유리하고, 간단한 전체 문자열 검증에는 String.matches() 메서드가 편리합니다.