자바에서 정규 표현식 기반의 문자열 처리를 할 때 java.util.regex.Matcher 클래스는 입력 텍스트에 대해 다양한 매칭 작업을 수행하는 엔진 역할을 합니다. 이 클래스는 별도의 생성자를 제공하지 않으며, java.util.regex.Pattern 클래스의 matcher() 메서드를 호출하여 객체를 얻을 수 있습니다.
Matcher 클래스의 replaceFirst() 메서드는 문자열 값을 인수로 받아, 입력 텍스트에서 정규 표현식과 일치하는 첫 번째 하위 시퀀스만 지정한 문자열로 치환한 결과를 반환합니다. 나머지 일치 항목은 원본 그대로 유지됩니다.
replaceFirst() 메서드의 특징
- 정규 표현식과 일치하는 첫 번째 부분만 치환합니다.
- 모든 일치 항목을 한 번에 바꾸려면
replaceAll()메서드를 사용해야 합니다. - 메서드가 호출되면 매처(Matcher)의 상태가 초기화되어 이후에 새로운 매칭 작업을 진행할 수 있습니다.
예제 1: 첫 번째 '#' 문자를 '@'로 바꾸기
다음 예제는 사용자로부터 문자열을 입력받은 뒤, '#' 문자가 몇 번 나타나는지 세어 출력하고, 첫 번째 '#'을 '@'으로 치환합니다.
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class ReplaceFirstExample {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("Enter input text: ");
String input = sc.nextLine();
String regex = "[#]";
// Pattern 객체 생성
Pattern pattern = Pattern.compile(regex);
// Matcher 객체 생성
Matcher matcher = pattern.matcher(input);
int count = 0;
while (matcher.find()) {
count++;
}
// 입력 텍스트 내 '#' 문자 개수 출력
System.out.println("입력한 텍스트에는 # 문자가 총 " + count + "번 등장합니다");
// 첫 번째 '#'을 '@'으로 치환
String result = matcher.replaceFirst("@");
System.out.println("#의 첫 번째 등장을 @로 치환한 결과 \n" + result);
}
}
실행 결과
Enter input text: Hello# How # are# you #welcome to Tutorials#point 입력한 텍스트에는 # 문자가 총 5번 등장합니다 #의 첫 번째 등장을 @로 치환한 결과 Hello@ How # are# you #welcome to Tutorials#point
실행 결과를 보면 텍스트에 포함된 5개의 '#' 중 첫 번째 하나만 '@'으로 바뀌고, 나머지 네 개는 그대로 유지되는 것을 확인할 수 있습니다.
예제 2: 첫 번째 공백을 '_'로 바꾸기
이번에는 정규 표현식 \s+를 사용해 연속된 공백을 하나의 일치 항목으로 인식하고, 첫 번째 공백을 밑줄(_)로 치환하는 예제입니다.
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class ReplaceFirstExample {
public static void main(String args[]) {
// 사용자로부터 문자열 입력 받기
System.out.println("문자열을 입력하세요");
Scanner sc = new Scanner(System.in);
String input = sc.nextLine();
String regex = "\\s+";
// 정규 표현식 컴파일
Pattern pattern = Pattern.compile(regex);
// Matcher 객체 생성
Matcher matcher = pattern.matcher(input);
// 첫 번째 공백을 '_'로 치환
String result = matcher.replaceFirst("_");
System.out.print("첫 번째 공백을 '_'로 치환한 결과: \n" + result);
}
}
실행 결과
문자열을 입력하세요 hello this is a sample text with irregular spaces 첫 번째 공백을 '_'로 치환한 결과: hello_this is a sample text with irregular spaces
여러 개의 공백이 있더라도 \s+ 패턴 덕분에 첫 번째 공백 그룹 전체가 하나의 '_'로 치환되며, 이후 공백들은 변경되지 않습니다.
마무리
replaceFirst()는 정규 표현식과 일치하는 첫 번째 문자열만 간편하게 치환할 수 있는 유용한 메서드입니다. 첫 번째 항목만 교체해야 하는 상황이라면 replaceAll()과 함께 적절히 활용하여 깔끔하고 효율적인 코드를 작성할 수 있습니다.