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

Java에서 문자열이 ASCII 문자만 포함하고 있는지 확인하는 방법

Java 프로그래밍을 하다 보면 입력받은 문자열이 순수한 ASCII 문자로만 구성되어 있는지 검증해야 하는 경우가 종종 있습니다. 예를 들어, 외부 시스템과의 데이터 교환이나 인코딩 호환성 문제를 방지하려면 비(非)ASCII 문자가 포함되어 있는지 확인하는 것이 중요합니다. 이 글에서는 두 가지 대표적인 방법을 소개합니다.

1. 정규 표현식(Regular Expression) 활용하기

문자열이 ASCII 문자만 포함하는지 확인하는 가장 간결한 방법은 다음 정규 표현식을 사용하는 것입니다.

\A\p{ASCII}*\z

이 정규 표현식의 의미는 다음과 같습니다.

  • \A : 문자열의 시작을 의미합니다.
  • \p{ASCII}* : ASCII 범위에 속하는 문자가 0개 이상 반복됨을 의미합니다.
  • \z : 문자열의 끝을 의미합니다.

String 클래스의 matches() 메서드는 정규 표현식을 매개변수로 받아 현재 문자열이 해당 표현식과 일치하는지 검사합니다. 일치하면 true, 그렇지 않으면 false를 반환합니다. 따라서 검증하려는 문자열에 대해 위 정규 표현식을 인자로 전달하며 matches() 메서드를 호출하면 됩니다.

예제 코드

import java.util.Scanner;

public class OnlyASCII {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("문자열을 입력하세요: ");
        String input = sc.nextLine();
        // ASCII 여부 검증
        boolean result = input.matches("\\A\\p{ASCII}*\\z");
        if(result) {
            System.out.println("문자열 승인됨");
        } else {
            System.out.println("비(非)ASCII 값이 포함되어 있습니다");
        }
    }
}

실행 결과 1 — ASCII만 포함된 경우

문자열을 입력하세요:
hello how are you
문자열 승인됨

실행 결과 2 — 비(非)ASCII 문자가 포함된 경우

문자열을 입력하세요:
whÿ do we fall
비(非)ASCII 값이 포함되어 있습니다

2. 각 문자를 개별적으로 검증하기

정규 표현식 대신 문자열의 모든 문자를 하나씩 확인하는 방법도 있습니다. ASCII 문자를 정수(int)로 변환하면 그 값은 항상 127 이하입니다. 이 원리를 이용해 각 문자의 코드 값을 검사할 수 있습니다.

  • String 클래스의 charAt() 메서드는 정수형 인덱스를 받아 해당 위치의 문자를 반환합니다.
  • 이 메서드를 사용해 문자열의 각 문자를 가져오고, 그 값이 127보다 큰지 확인합니다.

예제 코드

import java.util.Scanner;

public class OnlyASCII {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("문자열을 입력하세요: ");
        String input = sc.next();
        // 주어진 문자열을 문자 배열로 변환
        char charArray[] = input.toCharArray();
        boolean result = true;
        for(int i = 0; i < input.length(); i++) {
            int test = (int)input.charAt(i);
            if (test <= 127) {
                result = true;
            } else if (test > 127) {
                result = false;
            }
        }
        System.out.println(result);
        if(result) {
            System.out.println("문자열 승인됨");
        } else {
            System.out.println("비(非)ASCII 값이 포함되어 있습니다");
        }
    }
}

실행 결과 1 — 비(非)ASCII 문자가 포함된 경우

문자열을 입력하세요:
whÿ
false
비(非)ASCII 값이 포함되어 있습니다

실행 결과 2 — ASCII만 포함된 경우

문자열을 입력하세요:
hello
true
문자열 승인됨

두 방법의 비교 및 정리

정규 표현식 방식은 코드가 짧고 가독성이 좋아 간단한 검증에 적합합니다. 반면 charAt() 방식은 루프를 직접 제어할 수 있어, 특정 조건(예: 허용 가능한 최대 코드 값 변경, 예외 문자 처리 등)을 유연하게 추가할 때 유리합니다.

참고로 두 번째 예제 코드에는 한 가지 개선점이 있습니다. 루프 내에서 마지막 문자의 결과가 이전 결과를 덮어쓸 수 있으므로, 비(非)ASCII 문자를 발견하는 즉시 result = false;를 설정하고 break;로 루프를 빠져나오거나, 초기값을 false로 두고 하나라도 127 초과 값이 있으면 실패 처리하도록 작성하는 것이 더 안전합니다.

실무에서는 성능과 요구 사항에 따라 적절한 방법을 선택하면 되며, 대량의 텍스트를 처리하는 경우 정규 표현식을 미리 컴파일하여 재사용하는 Pattern 클래스 활용도 고려해 볼 만합니다.