Computer >> 컴퓨터 >  >> 프로그래밍 >> Java

Java 정규식(RegEx)으로 단어가 아닌 문자를 매칭하는 방법

영문 알파벳(대소문자 모두)과 숫자(0~9)를 제외한 나머지 모든 문자는 단어가 아닌 문자(non-word character)로 간주됩니다. Java 정규식에서는 메타 문자 \W를 사용하면 이러한 문자들을 간편하게 매칭할 수 있습니다.

메타 문자 \W란?

\W[^a-zA-Z0-9_]와 같은 의미로, 알파벳·숫자·밑줄(_)을 제외한 특수 기호나 공백 등에 해당합니다. 반대로 소문자 \w는 단어 문자(word character), 즉 알파벳과 숫자, 밑줄을 매칭하는 데 사용됩니다.

예제 1: Pattern과 Matcher 클래스 활용하기

아래 예제는 PatternMatcher 클래스를 사용해 입력 문자열이 정확히 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() 메서드가 편리합니다.