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

Java Matcher appendReplacement() 메서드 완벽 가이드 – 예제로 배우는 문자열 치환

java.util.regex.Matcher 클래스는 정규 표현식을 기반으로 다양한 매칭 작업을 수행하는 엔진 역할을 합니다. 이 클래스는 별도의 생성자를 제공하지 않으며, java.util.regex.Pattern 클래스의 matcher() 메서드를 호출하여 객체를 얻을 수 있습니다.

Matcher 클래스의 appendReplacement() 메서드는 StringBuffer 객체와 대체 문자열(replacement string)을 매개변수로 받습니다. 이 메서드는 입력 데이터를 StringBuffer에 복사하되, 정규 표현식과 일치하는 부분을 만나면 해당 내용을 대체 문자열로 바꾸어 버퍼에 추가합니다.

내부 동작 방식

appendReplacement() 메서드가 내부적으로 동작하는 과정은 다음과 같습니다.

  • 입력 문자열의 문자를 하나씩 읽어 StringBuffer에 추가합니다.
  • 매칭이 발생하면 일치된 부분 대신 대체 문자열을 버퍼에 추가합니다.
  • 매칭된 하위 문자열의 다음 위치부터 다시 스캔을 계속합니다.

참고로, 마지막 매칭 이후 남은 문자열까지 버퍼에 모두 담으려면 반복문 종료 후 반드시 appendTail() 메서드를 호출해야 합니다.

예제 1: HTML <b> 태그 내용을 다른 문자열로 대체하기

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class AppendReplacementExample {
    public static void main(String[] args) {
        String str = "<p>This <b>is</b> an <b>example</b>HTML <b>script</b>.</p>";
        // b 태그로 묶인 내용을 찾기 위한 정규 표현식
        String regex = "<b>(\\S+)</b>";
        System.out.println("입력 문자열: \n" + str);

        // 패턴 객체 생성
        Pattern pattern = Pattern.compile(regex);
        // 문자열에서 패턴과 일치하는 부분을 찾는 Matcher 객체 생성
        Matcher matcher = pattern.matcher(str);

        // 빈 StringBuffer 생성
        StringBuffer sb = new StringBuffer();
        while (matcher.find()) {
            matcher.appendReplacement(sb, "BoldData");
        }
        // 마지막 매칭 이후 남은 문자열 추가
        matcher.appendTail(sb);

        System.out.println("StringBuffer의 최종 내용: \n" + sb.toString());
    }
}

실행 결과

입력 문자열:
<p>This <b>is</b> an <b>example</b>HTML <b>script</b>.</p>
StringBuffer의 최종 내용:
<p>This BoldData an BoldDataHTML BoldData.</p>

위 예제에서는 <b> 태그로 감싸진 세 단어(is, example, script)가 모두 "BoldData"로 치환된 것을 확인할 수 있습니다. 태그 자체(<b>, </b>)까지 함께 매칭되어 대체 문자열로 교체되었습니다.

예제 2: 문자열에서 특수 문자 제거하기

import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class AppendReplacementExample {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("텍스트를 입력하세요: ");
        String input = sc.nextLine();

        // 제거할 특수 문자를 나타내는 정규 표현식
        String regex = "[#$&+=@|<>-]";

        // 패턴 객체 생성
        Pattern pattern = Pattern.compile(regex);
        // Matcher 객체 생성
        Matcher matcher = pattern.matcher(input);

        int count = 0;
        StringBuffer buffer = new StringBuffer();
        while (matcher.find()) {
            count++;
            // 매칭된 특수 문자를 빈 문자열로 대체(제거)
            matcher.appendReplacement(buffer, "");
        }
        matcher.appendTail(buffer);

        System.out.println("특수 문자는 총 " + count + "번 나타났습니다.");
        System.out.println("특수 문자가 모두 제거된 텍스트: \n" + buffer.toString());
    }
}

실행 결과

텍스트를 입력하세요:
Hello# how$ are& yo|u welco<me to> Tut-oria@ls@po-in#t.
특수 문자는 총 11번 나타났습니다.
특수 문자가 모두 제거된 텍스트:
Hello how are you welcome to Tutorialspoint.

이 예제에서는 대체 문자열로 빈 문자열("")을 전달하여 매칭된 특수 문자를 사실상 삭제했습니다. 또한 find()가 호출될 때마다 카운트를 증가시켜 특수 문자가 몇 번 등장했는지도 함께 확인할 수 있습니다.

정리

  • appendReplacement()는 find()로 찾은 매칭 결과를 지정한 문자열로 바꾸면서 StringBuffer에 순차적으로 추가합니다.
  • 대체 문자열에서는 $n 형식의 그룹 참조와 백슬래시(\) 참조를 사용할 수 있어 유연한 치환이 가능합니다.
  • 반복문이 끝난 뒤에는 반드시 appendTail()을 호출해야 마지막 매칭 이후의 나머지 문자열이 누락되지 않습니다.
  • Java 9 이상에서는 StringBuffer 대신 StringBuilder를 받는 오버로드 버전도 제공됩니다.