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

Java 정규식 POSIX 문자 클래스 \p{Punct} 완벽 가이드 – 문장부호 매칭 예제

POSIX 문자 클래스 \p{Punct}는 자바 정규 표현식에서 문장부호(구두점) 문자와 일치시키기 위해 사용되는 패턴입니다. 이 클래스가 일치시키는 문장부호는 다음과 같습니다.

!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~

즉, 쉼표, 마침표, 느낌표, 물음표 등 흔히 사용되는 ASCII 문장부호 전체를 포괄하며, 문자열 검증·필터링·개수 집계 등에 유용하게 활용할 수 있습니다.

예제 1: 문자열에 포함된 문장부호 개수 세기

다음 예제는 사용자로부터 문자열을 입력받은 뒤, \p{Punct} 패턴으로 문장부호를 하나씩 찾아 그 개수를 출력합니다.

import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class AlphanumericExample {
    public static void main(String args[]) {
        //사용자로부터 문자열 입력받기
        System.out.println("문자열을 입력하세요");
        Scanner sc = new Scanner(System.in);
        String input = sc.nextLine();
        //정규 표현식 정의
        String regex = "[\\p{Punct}]";
        //정규 표현식 컴파일
        Pattern pattern = Pattern.compile(regex);
        //Matcher 객체 생성
        Matcher matcher = pattern.matcher(input);
        int count = 0;
        while(matcher.find()) {
            count++;
        }
        System.out.println("문장부호 개수: "+count);
    }
}

실행 결과

문자열을 입력하세요
Hello, how are you. Welcome to Tutorialspoint.
문장부호 개수: 3

위 실행 결과에서 쉼표(,) 한 개와 마침표(.) 두 개, 총 3개의 문장부호가 발견되어 개수가 3으로 출력됩니다.

예제 2: 문장부호로만 구성된 문자열 찾기

이번 예제는 5개의 입력 문자열 중에서 오직 문장부호 문자로만 이루어진 문자열을 골라내어 출력합니다. 정규 표현식 ^\p{Punct}+$는 문자열의 시작(^)부터 끝($)까지 모든 문자가 문장부호인 경우에만 일치합니다.

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 = "^\\p{Punct}+$";
        //입력 데이터 받기
        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.matches()) {
                System.out.println(m.group());
            }
        }
    }
}

실행 결과

5개의 문자열을 입력하세요:
hello
1234
123text.!!
!!!!!
..!!,,
문장부호 문자로만 구성된 문자열:
!!!!!
..!!,,

"hello", "1234", "123text.!!"는 각각 영문자나 숫자가 포함되어 있어 제외되었고, 오직 문장부호로만 이루어진 "!!!!!"와 "..!!,,"만 출력됩니다.

\p{Punct} 사용 시 주의 사항

  • 자바 문자열에서 역슬래시(\)는 특수 문자이므로 반드시 \\p{Punct}처럼 두 번 작성해야 합니다.
  • [\p{Punct}]처럼 대괄호 안에 넣으면 문자 클래스의 일부로 활용할 수 있습니다.
  • \p{Punct}는 ASCII 범위의 문장부호만 일치시키므로, 한글 특수 기호(예: 「」, ·)까지 처리하려면 별도의 패턴이 필요합니다.
  • 문자열 전체가 문장부호로만 되어 있는지 검사하려면 matches() 메서드를 사용하거나, find()와 함께 쓸 경우 ^$ 앵커를 활용하면 됩니다.