Java에서 정규표현식 매칭을 다루다 보면 매처(Matcher) 영역(region)의 경계가 탐색 범위에 어떤 영향을 미치는지 이해하는 것이 중요합니다. 이 글에서는 java.util.regex.Matcher 클래스의 useTransparentBounds() 메서드를 예제와 함께 자세히 살펴보겠습니다.
Matcher 클래스란?
java.util.regex.Matcher 클래스는 다양한 매칭(match) 연산을 수행하는 엔진을 나타냅니다. 이 클래스에는 별도의 생성자가 없으며, java.util.regex.Pattern 클래스의 matcher() 메서드를 사용해 객체를 생성하거나 얻을 수 있습니다.
투명 경계(Transparent Bounds)의 개념
정규표현식에서 룩어헤드(lookahead)와 룩비하인드(lookbehind) 구문은 다른 패턴 앞에 오거나 뒤에 따라오는 특정 패턴을 매칭할 때 사용됩니다. 예를 들어, 6자에서 10자 사이의 문자열만 허용하고 싶다면 다음과 같은 정규표현식을 작성할 수 있습니다.
"\\A(?=\\w{6,10}\\z)";기본적으로 매처 영역의 경계는 룩어헤드, 룩비하인드, 경계 매칭(boundary matching) 구문에 대해 불투명(opaque)하게 설정되어 있습니다. 즉, 이러한 구문들은 영역 경계를 넘어서 입력 텍스트의 내용을 매칭할 수 없습니다.
예제 1: 기본 상태(불투명 경계)에서의 동작
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class useTransparentBoundsExample {
public static void main(String[] args) {
// 6~10자를 허용하는 정규표현식
String regex = "\\A(?=\\w{6,10}\\z)";
System.out.println("Enter 5 to 12 characters: ");
String input = new Scanner(System.in).next();
// Pattern 객체 생성
Pattern pattern = Pattern.compile(regex);
// Matcher 객체 생성
Matcher matcher = pattern.matcher(input);
// 입력 문자열에 영역(region) 설정
matcher.region(0, 4);
if(matcher.find()) {
System.out.println("Match found");
} else {
System.out.println("Match not found");
}
}
}실행 결과
Enter 5 to 12 characters: sampleText Match not found
영역이 (0, 4)로 설정되었고 경계가 불투명하기 때문에, 룩어헤드 구문은 영역 밖(4번째 인덱스 이후)의 문자들을 확인할 수 없습니다. 따라서 전체 문자열 길이 조건을 만족하지 못해 매칭에 실패합니다.
useTransparentBounds() 메서드의 역할
useTransparentBounds() 메서드는 boolean 값을 인자로 받습니다.
- true 전달 시: 현재 매처가 투명 경계(transparent bounds)를 사용하여, 룩어헤드·룩비하인드 등의 구문이 영역 경계 너머의 텍스트까지 검사할 수 있습니다.
- false 전달 시: 불투명 경계(non-transparent bounds)를 사용하며, 이것이 기본값입니다.
예제 2: 투명 경계 활성화
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Example {
public static void main(String[] args) {
// 6~10자를 허용하는 정규표현식
String regex = "\\A(?=\\w{6,10}\\z)";
System.out.println("Enter 5 to 12 characters: ");
String input = new Scanner(System.in).next();
// Pattern 객체 생성
Pattern pattern = Pattern.compile(regex);
// Matcher 객체 생성
Matcher matcher = pattern.matcher(input);
// 입력 문자열에 영역(region) 설정
matcher.region(0, 4);
// 투명 경계로 전환
matcher = matcher.useTransparentBounds(true);
if(matcher.find()) {
System.out.println("Match found");
} else {
System.out.println("Match not found");
}
}
}실행 결과
Enter 5 to 12 characters: sampletext Match found
useTransparentBounds(true)를 호출한 후에는 룩어헤드 구문이 영역 경계 너머의 전체 입력 문자열을 확인할 수 있게 되므로, 문자열 길이 조건(\w{6,10})이 충족되어 매칭에 성공합니다.
정리
hasTransparentBounds() 메서드로 현재 경계 상태를 확인할 수 있으며, regionStart()와 regionEnd()로 영역 설정값을 조회할 수도 있습니다. 영역(region)을 제한적으로 설정하면서도 전체 문맥을 고려한 정규표현식 매칭이 필요하다면 useTransparentBounds(true)를 활용하는 것이 유용합니다.