정규식에서 서브 표현식이자 메타문자인 \W는 비단어 문자(non-word character), 즉 영문자·숫자·밑줄(_)을 제외한 모든 문자와 일치합니다. 공백, 특수 기호, 문장부호 등이 여기에 해당하며, \w(단어 문자)의 반대 개념입니다.
예제 1: 비단어 문자 개수 세기
다음 예제는 입력 문자열에서 \W 패턴과 일치하는 문자가 몇 개 있는지 확인합니다. 정규식을 \\W!로 작성하여 느낌표(!) 앞에 위치한 비단어 문자를 찾습니다.
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegexExample {
public static void main(String args[]) {
String regex = "\\W!";
String input = "Hello 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("Number of matches: "+count);
}
}실행 결과
Number of matches: 1
입력 문자열에서 느낌표 바로 앞의 공백 문자가 비단어 문자에 해당하므로, 일치 횟수는 1회입니다.
예제 2: 비단어 문자를 포함한 문자열 필터링
다음 예제는 사용자로부터 5개의 문자열을 입력받은 뒤, 그중 비단어 문자를 포함하고 있는 문자열만 골라 출력합니다. 정규식 \\W.*$는 비단어 문자로 시작하여 그 뒤의 모든 문자까지를 의미합니다.
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Example {
public static void main( String args[] ) {
String regex = "\\W.*$";
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 that contain non-word 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: $hello sample test1 test2 #$&* Strings that contain non-word characters: $hello #$&*
핵심 정리
- \W: 단어 문자(영문자, 숫자, 밑줄)가 아닌 모든 문자와 일치하며,
[^a-zA-Z0-9_]와 동일한 의미입니다. - \w: 단어 문자 자체와 일치하며,
\W의 정반대 역할을 합니다. - Java 코드에서 정규식을 문자열로 작성할 때는 백슬래시를 이스케이프해야 하므로
"\\W"처럼 두 번 작성해야 합니다.
이처럼 \W 메타문자를 활용하면 특수문자 검증, 입력값 유효성 검사, 불필요한 기호 제거 등 다양한 문자열 처리 작업을 간결하게 구현할 수 있습니다.