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

자바(Java) 정규식 POSIX 문자 클래스 \p{Graph} 사용법과 예제

\p{Graph}는 자바 정규식에서 사용되는 POSIX 문자 클래스 중 하나로, 알파벳, 숫자, 문장 부호처럼 실제로 화면에 '보이는' 모든 문자와 일치합니다. 다시 말해 공백을 제외한 인쇄 가능한(printable) ASCII 문자 전체를 의미하며, 스페이스·탭·줄바꿈 같은 공백 문자나 제어 문자는 매칭 대상에서 제외됩니다.

\p{Graph}가 일치하는 문자 범위

  • 포함: 영문 대소문자(A-Z, a-z), 숫자(0-9), 특수 문자 및 문장 부호(!, @, #, $, % 등)
  • 제외: 공백, 탭, 줄바꿈 등의 공백류 문자와 제어 문자
  • 참고: 자바의 \p{Graph}는 ASCII 범위만 지원하므로, 한글이나 ö, ä, ü처럼 악센트가 있는 비(非)ASCII 문자는 일치하지 않습니다.

예제 1: 문자열에서 보이는 문자 개수 세기

다음 예제는 사용자로부터 문자열을 입력받은 뒤, 정규 표현식 [\p{Graph}]를 이용해 출력 가능한 문자가 몇 개인지 세어 결과를 출력합니다.

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

public class VisibleCharacters {
   public static void main(String args[]) {
      // 사용자로부터 문자열 입력받기
      System.out.println("문자열을 입력하세요");
      Scanner sc = new Scanner(System.in);
      String input = sc.nextLine();
      // 정규 표현식 정의
      String regex = "[\\p{Graph}]";
      // 정규 표현식 컴파일
      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"의 알파벳 4글자만 카운트된 것을 확인할 수 있습니다. ö, ä, ü, ç, ã, Ã는 ASCII 범위를 벗어난 문자이므로 \p{Graph}와 일치하지 않고, 공백 역시 제외됩니다.

실행 결과 2

문자열을 입력하세요
welcome to tutorialspoint
보이는 문자의 개수: 23

"welcome"(7자), "to"(2자), "tutorialspoint"(14자)의 알파벳을 합쳐 총 23개가 카운트되었습니다. 단어 사이의 공백 두 개는 포함되지 않습니다.

예제 2: 출력 가능한 문자로만 구성된 문자열 검증하기

이번에는 ^\p{Graph}+$ 패턴을 사용해, 입력된 여러 문자열 중 오직 보이는 문자(ASCII 출력 가능 문자)로만 이루어진 문자열을 걸러내는 예제입니다.

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{Graph}+$";
      // 입력 데이터 받기
      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 문자가 섞여 있어 전체 일치 조건(^...$)을 만족하지 못했고, "öäüçãÃ" 역시 모든 글자가 \p{Graph} 범위 밖이므로 제외되었습니다. 반면 "Hello1234", "1234", "welcome"은 알파벳과 숫자로만 구성되어 있어 정상적으로 통과했습니다.

마무리 및 참고 사항

\p{Graph}는 입력값 검증(예: 공백이나 특수문자가 없는 ID 검사)이나 문자열 내 유효 문자 개수 계산 등에 유용하게 활용할 수 있습니다. 만약 유니코드 문자까지 포함해 매칭하고 싶다면, Pattern.compile() 호출 시 Pattern.UNICODE_CHARACTER_CLASS 플래그를 함께 사용하거나 \p{IsAlphabetic}, \p{IsAlphanumeric} 같은 유니코드 기반 문자 클래스를 활용하는 것이 좋습니다.