Java 정규식에서 \p{ASCII}는 POSIX 문자 클래스(predefined character class) 중 하나로, 아스키(ASCII) 코드 범위에 포함된 모든 문자, 즉 \x00-\x7F(10진수 0~127) 사이의 문자와 일치합니다.
\p{ASCII} 문자 클래스란?
POSIX 문자 클래스는 자주 쓰이는 문자 그룹을 미리 정의해 둔 것으로, 복잡한 문자 집합을 일일이 나열하지 않고도 간결하게 표현할 수 있게 해 줍니다. 그중 \p{ASCII}는 다음과 같은 문자들을 포함합니다.
- 영문 대소문자(A-Z, a-z)
- 숫자(0-9)
- 공백, 탭, 줄 바꿈 등 각종 공백 문자
- 특수 기호와 제어 문자를 포함한 코드 0~127의 모든 문자
반면 한글, 한자, é, ü처럼 ASCII 범위를 벗어나는 문자는 \p{ASCII}와 일치하지 않습니다. 이러한 문자를 찾으려면 부정(negate) 형태인 \P{ASCII} 또는 [^\p{ASCII}]를 사용하면 됩니다.
예제: 문자열에서 ASCII가 아닌 문자 개수 세기
다음 예제는 사용자로부터 문자열을 입력받은 뒤, 그중 ASCII 범위를 벗어나는 문자가 몇 개인지 세어 출력합니다.
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Example {
public static void main(String args[]) {
// 사용자로부터 문자열 입력받기
System.out.println("문자열을 입력하세요");
Scanner sc = new Scanner(System.in);
String input = sc.nextLine();
// 정규 표현식: ASCII가 아닌 문자 1개
String regex = "[^\\p{ASCII}]";
// 정규 표현식 컴파일
Pattern pattern = Pattern.compile(regex);
// Matcher 객체 생성
Matcher matcher = pattern.matcher(input);
int count = 0;
while (matcher.find()) {
count++;
}
System.out.println("입력한 문자열의 비(非)ASCII 문자 개수: " + count);
}
}실행 결과
문자열을 입력하세요
why do we fäll
입력한 문자열의 비(非)ASCII 문자 개수: 1입력 문자열 "why do we fäll"에는 'ä' 한 글자만 ASCII 범위를 벗어나므로 결과가 1로 출력됩니다. 모든 문자가 ASCII라면 0이 출력됩니다.
응용: 문자열 전체가 ASCII로만 이루어졌는지 검사하기
입력값 검증 등에서 문자열 전체가 ASCII 문자로만 구성되어 있는지 확인하려면 다음과 같이 작성할 수 있습니다.
boolean isAsciiOnly = input.matches("[\\p{ASCII}]*");Pattern·Matcher를 사용하는 경우 ^[\\p{ASCII}]+$ 패턴으로 검사할 수도 있습니다.
참고: 주요 POSIX 문자 클래스
| 패턴 | 의미 | 동등한 표현 |
|---|---|---|
| \p{Lower} | 소문자 알파벳 | [a-z] |
| \p{Upper} | 대문자 알파벳 | [A-Z] |
| \p{Alpha} | 알파벳(대소문자) | [a-zA-Z] |
| \p{Digit} | 숫자 | [0-9] |
| \p{Alnum} | 영숫자 | [a-zA-Z0-9] |
| \p{Punct} | 구두점·기호 | "!#$%&'()*+,-./:;<=>?@[\]^_`{|}~" |
| \p{Space} | 공백 문자 | [ \t\n\x0B\f\r] |
| \p{Cntrl} | 제어 문자 | [\x00-\x1F\x7F] |
| \p{ASCII} | 모든 ASCII 문자 | [\x00-\x7F] |
이처럼 \p{ASCII}는 입력 데이터에 멀티바이트 문자나 유니코드 확장 문자가 섞여 있는지 확인할 때 유용하게 활용됩니다.