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

Java 정규식 POSIX 문자 클래스 \p{ASCII} 완벽 가이드 – ASCII 문자 매칭과 비(非)ASCII 문자 찾기

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}는 입력 데이터에 멀티바이트 문자나 유니코드 확장 문자가 섞여 있는지 확인할 때 유용하게 활용됩니다.