\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 문자나 제어 문자 차단 등)에 유용하게 활용됩니다. 다만 유니코드 문자도 허용해야 하는 서비스라면 이 클래스 대신 별도의 패턴을 설계해야 한다는 점을 기억하세요.