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

Java 정규식 replaceAll()로 일치하는 모든 문자열 치환하기

정규식 컴파일과 Matcher 객체 생성

Java에서 정규식 치환 작업을 수행하려면 먼저 Pattern.compile() 메서드로 원하는 정규식을 컴파일한 뒤, 입력 문자열을 인자로 matcher() 메서드에 전달하여 Matcher 객체를 생성해야 합니다.

Matcher 객체를 확보했다면 replaceAll() 메서드를 통해 입력 문자열에서 패턴과 일치하는 모든 부분을 지정한 문자열로 교체할 수 있습니다. 이 메서드는 대체 문자열(replacement string)을 매개변수로 받으며, 입력 문자열의 모든 일치 항목을 해당 문자열로 바꾼 결과를 새 문자열로 반환합니다.

예제 1 — 탭 문자를 공백으로 치환하기

다음 예제는 사용자가 입력한 텍스트에서 연속된 탭 문자(\t+)를 찾아 모두 일반 공백으로 바꾸는 프로그램입니다.

import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class ReplaceAll {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("Enter input text: ");
        String input = sc.nextLine();
        String regex = "\\t+";
        // 패턴 객체 생성
        Pattern pattern = Pattern.compile(regex);
        // 컴파일된 패턴을 문자열에 적용
        Matcher matcher = pattern.matcher(input);
        int count = 0;
        while (matcher.find()) {
            count++;
        }
        System.out.println("No.of matches: " + count);
        String result = matcher.replaceAll(" ");
        System.out.println("Result: " + result);
    }
}

실행 결과

Enter input text:
sample	text	with	tab	spaces
No.of matches: 4
Result: sample text with tab spaces

실행 결과를 보면 입력 문자열에 포함된 4개의 탭이 각각 하나의 공백으로 대체되었음을 확인할 수 있습니다.

첫 번째 일치 항목만 교체하는 replaceFirst()

모든 일치 항목이 아닌 첫 번째 일치 항목만 교체하고 싶다면 Matcher 클래스의 replaceFirst() 메서드를 사용하면 됩니다. 사용법은 replaceAll()과 동일하지만, 오직 가장 처음 발견된 패턴 하나만 대체한다는 점이 다릅니다.

예제 2 — 첫 번째 숫자만 '#'으로 치환하기

아래 예제는 입력 문자열에서 숫자(\d)를 찾고, 그중 첫 번째 숫자만 '#' 기호로 바꾸는 코드입니다.

import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class ReplaceAll {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("Enter input text: ");
        String input = sc.nextLine();
        String regex = "\\d";
        // 패턴 객체 생성
        Pattern pattern = Pattern.compile(regex);
        // 컴파일된 패턴을 문자열에 적용
        Matcher matcher = pattern.matcher(input);
        int count = 0;
        while (matcher.find()) {
            count++;
        }
        System.out.println("No.of matches: " + count);
        String result = matcher.replaceFirst("#");
        System.out.println("Result: " + result);
    }
}

실행 결과

Enter input text:
test data 1 2 3
No.of matches: 3
Result: test data # 2 3

참고: String 클래스의 편의 메서드

간단한 치환 작업이라면 Matcher 객체를 직접 다루지 않고도 String 클래스가 제공하는 replaceAll(), replaceFirst() 메서드를 바로 호출할 수 있습니다. 이 메서드들은 내부적으로 Pattern과 Matcher를 생성해 동일한 결과를 반환하므로, 한 줄의 코드로도 손쉽게 정규식 치환을 처리할 수 있습니다.