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를 받는 오버로드 버전도 제공됩니다.