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()와 함께 쓸 경우^와$앵커를 활용하면 됩니다.