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

자바(Java) 문자열에서 ASCII가 아닌 문자를 제거하는 방법

POSIX 문자 클래스인 \p{ASCII}는 ASCII 문자와 일치하며, 메타 문자 ^(캐럿)는 부정(negation)의 역할을 합니다.

즉, 다음 정규 표현식은 모든 비(非)ASCII 문자와 일치합니다.

[^\p{ASCII}]

String 클래스의 replaceAll() 메서드는 정규 표현식과 대체 문자열을 인수로 받아, 현재 문자열에서 해당 패턴과 일치하는 문자들을 지정한 대체 문자열로 교체합니다.

따라서 replaceAll() 메서드를 사용해 일치하는 문자들을 빈 문자열(" ")로 교체하면, 비ASCII 문자를 손쉽게 제거할 수 있습니다.

예제 1

가장 간단한 방법은 Scanner로 입력을 받은 뒤 replaceAll()로 바로 제거하는 것입니다.

import java.util.Scanner;
public class Exp {
    public static void main(String args[]) {
        Scanner sc = new Scanner(System.in);
        String regex = "[^\\p{ASCII}]";
        System.out.println("Enter input data:");
        String input = sc.nextLine();
        String result = input.replaceAll(regex, "");
        System.out.println("Result: " + result);
    }
}

실행 결과

Enter input data:
whÿ do we fall
Result: wh do we fall

위 실행 결과에서 볼 수 있듯이, 입력 문자열에 포함된 비ASCII 문자 'ÿ'가 제거되고 나머지 ASCII 문자만 출력됩니다.

예제 2

Pattern과 Matcher 클래스를 직접 사용하는 방법도 있습니다. 이 방식은 정규 표현식을 컴파일하여 재사용할 수 있어 성능 면에서 유리합니다.

import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Example {
    public static void main(String args[]) {
        Scanner sc = new Scanner(System.in);
        System.out.println("Enter input string: ");
        String input = sc.nextLine();
        String regex = "[^\\p{ASCII}]";
        // 패턴 객체 생성
        Pattern pattern = Pattern.compile(regex);
        // 문자열에서 컴파일된 패턴과 일치하는 부분 찾기
        Matcher matcher = pattern.matcher(input);
        // 빈 StringBuffer 생성
        StringBuffer sb = new StringBuffer();
        while (matcher.find()) {
            matcher.appendReplacement(sb, "");
        }
        matcher.appendTail(sb);
        System.out.println("Result: \n" + sb.toString());
    }
}

실행 결과

Enter input string:
whÿ do we fall
Result:
wh do we fall

정리

  • [^\p{ASCII}] : ASCII 범위(0~127)에 속하지 않는 모든 문자와 일치하는 정규 표현식입니다.
  • replaceAll(regex, "") : 일치하는 문자를 빈 문자열로 교체하여 제거하는 가장 간결한 방법입니다.
  • Pattern / Matcher : 반복적으로 동일한 정규 표현식을 사용할 경우, 패턴을 미리 컴파일해 두면 처리 속도를 개선할 수 있습니다.