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 : 반복적으로 동일한 정규 표현식을 사용할 경우, 패턴을 미리 컴파일해 두면 처리 속도를 개선할 수 있습니다.