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

Java 정규식 POSIX 문자 클래스 \p{Print} 사용법과 예제 총정리

\p{Print}는 Java 정규식에서 지원하는 POSIX 문자 클래스 중 하나로, 인쇄 가능한(printable) 모든 ASCII 문자와 일치합니다. 공백 문자까지 포함되며, 일치 범위는 \x20(공백)부터 \x7E(물결표 ~)까지입니다.

\p{Print}가 일치하는 문자

  • 영문 알파벳 대소문자 (A-Z, a-z)
  • 숫자 (0-9)
  • 특수 기호 및 문장 부호 (!, @, #, $ 등)
  • 공백 문자 (space)

반면 ö, ä, ü, ç처럼 ASCII 범위를 벗어난 확장 문자나 한글 같은 유니코드 문자는 일치하지 않습니다. 참고로 공백을 제외한 인쇄 가능 문자만 검사하고 싶다면 \p{Graph}를 사용하면 됩니다.

예제 1: 인쇄 가능한 문자 개수 세기

사용자에게 문자열을 입력받은 뒤, 정규식 [\p{Print}]로 한 글자씩 검사하여 인쇄 가능한 문자가 몇 개인지 출력합니다.

import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

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

실행 결과 1

문자열을 입력하세요
test
인쇄 가능한 문자 수: 4

"test"의 네 글자는 모두 ASCII 인쇄 가능 문자이므로 개수가 4로 출력됩니다.

실행 결과 2

문자열을 입력하세요
öäüçãÃ
인쇄 가능한 문자 수: 0

ö, ä, ü, ç, ã, Ã는 ASCII 범위 밖의 확장 문자이므로 \p{Print}와 하나도 일치하지 않아 개수가 0으로 출력됩니다.

예제 2: 인쇄 가능한 문자만 포함된 문자열 걸러내기

5개의 문자열을 입력받은 후, 정규식 ^\p{Print}+$에 전체 일치하는 문자열만 골라서 출력합니다.

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{Print}+$";
      // 입력 데이터 받기
      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öäüçãÃ
öäüçãÃ
Hello1234
1234
welcome
인쇄 가능한 문자만 포함된 문자열: 
Hello1234
1234
welcome

악센트 문자가 포함된 "helloöäüçãÃ"와 "öäüçãÃ"는 필터링되고, ASCII 인쇄 가능 문자로만 구성된 "Hello1234", "1234", "welcome"만 출력됩니다.

마무리

\p{Print}는 공백을 포함한 ASCII 인쇄 가능 문자를 간편하게 검사할 수 있어, 입력값 검증(비ASCII 문자나 제어 문자 차단 등)에 유용하게 활용됩니다. 다만 유니코드 문자도 허용해야 하는 서비스라면 이 클래스 대신 별도의 패턴을 설계해야 한다는 점을 기억하세요.