문자열 처리 작업 중에는 특정 숫자만 남기고 나머지 숫자를 모두 제거해야 하는 경우가 있습니다. Java에서는 정규 표현식(Regular Expression)과 replaceAll() 메서드를 조합하면 이러한 작업을 간단하게 처리할 수 있습니다.
핵심 원리
- 정규 표현식 "(?<!\d)숫자(?!\d)"는 지정한 숫자 하나와 정확히 일치합니다. 여기서
(?<!\d)는 뒤쪽 탐색(Lookbehind),(?!\d)는 앞쪽 탐색(Lookahead)으로, 해당 숫자 앞뒤에 다른 숫자가 붙어 있지 않은 경우에만 매칭됩니다. 즉, '12'처럼 두 자리 숫자의 일부가 아닌 독립적인 '1'이나 '2'만 찾아냅니다. replaceAll()메서드는 정규 표현식 패턴과 대체 문자열 두 개의 인자를 받으며, 입력 문자열에서 패턴에 일치하는 부분을 지정한 문자열로 교체합니다.- 따라서 문자열에서 1과 2를 제외한 모든 숫자를 제거하려면, 먼저 숫자 1과 2를 각각 "one"과 "two" 같은 단어로 치환한 뒤, 나머지 모든 숫자를 빈 문자열로 대체하면 됩니다.
예제 코드
import java.util.Scanner;
public class RegexExample {
public static void main(String args[]) {
// 사용자로부터 문자열 입력받기
System.out.println("문자열을 입력하세요");
Scanner sc = new Scanner(System.in);
String input = sc.nextLine();
// 숫자 1과 일치하는 정규 표현식
String regex1 = "(?<!\\d)1(?!\\d)";
// 숫자 2와 일치하는 정규 표현식
String regex2 = "(?<!\\d)2(?!\\d)";
// 1과 2는 단어로 치환하고, 나머지 숫자는 모두 제거
String result = input.replaceAll(regex1, "one")
.replaceAll(regex2, "two")
.replaceAll("\\s*\\d+", "");
System.out.print("결과: " + result);
}
}실행 결과
문자열을 입력하세요 sample 1 2 3 4 5 6 결과: sample one two
동작 방식 설명
위 예제의 처리 과정은 다음 세 단계로 이루어집니다.
- 1차 치환: 독립적으로 존재하는 숫자 1을 "one"으로 바꿉니다. 이때 앞뒤 탐색 조건 덕분에 '12' 속의 '1'은 치환되지 않습니다.
- 2차 치환: 마찬가지 방식으로 숫자 2를 "two"로 바꿉니다.
- 3차 치환: 정규 표현식
\s*\d+를 사용하여 남아 있는 모든 숫자와 그 앞의 공백까지 빈 문자열로 제거합니다. 공백까지 함께 제거하므로 결과 문자열에 불필요한 연속 공백이 생기지 않습니다.
이처럼 앞쪽·뒤쪽 탐색 기능을 활용하면 다중 자릿수 숫자와 충돌하지 않으면서 특정 숫자만 안전하게 보호할 수 있어, 다양한 문자열 필터링 작업에 응용할 수 있습니다.