java.util.regex.Matcher 클래스는 다양한 매칭(match) 연산을 수행하는 엔진을 나타냅니다. 이 클래스에는 별도의 생성자가 없으며, java.util.regex.Pattern 클래스의 matcher() 메서드를 호출하여 Matcher 객체를 생성하거나 얻을 수 있습니다.
앵커링 경계(anchoring bounds)는 검색 영역(region)의 경계에서 ^나 $ 같은 앵커가 어떻게 매칭되는지를 결정하는 설정입니다. 기본적으로 Matcher는 앵커링 경계를 사용하도록 되어 있습니다.
Matcher 클래스의 useAnchoringBounds() 메서드는 boolean 값을 인수로 받습니다. true를 전달하면 현재 매처가 앵커링 경계를 사용하고, false를 전달하면 비앵커링(non-anchoring) 경계를 사용합니다. 현재 설정 상태는 hasAnchoringBounds() 메서드로 확인할 수 있습니다.
예제 1: useAnchoringBounds(false) 적용하기
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Trail {
public static void main( String args[] ) {
// 입력 문자열 읽기
Scanner sc = new Scanner(System.in);
System.out.println("Enter input string");
String input = sc.nextLine();
// 숫자를 찾기 위한 정규 표현식
String regex = ".*\\d+.*";
// 정규 표현식 컴파일
Pattern pattern = Pattern.compile(regex);
// 컴파일된 정규 표현식 출력
System.out.println("Compiled regular expression: " + pattern.toString());
// Matcher 객체 가져오기
Matcher matcher = pattern.matcher(input);
matcher.useAnchoringBounds(false);
boolean hasBounds = matcher.hasAnchoringBounds();
if(hasBounds) {
System.out.println("Current matcher uses anchoring bounds");
} else {
System.out.println("Current matcher uses non-anchoring bounds");
}
}
}실행 결과
Enter input string sample Compiled regular expression: .*\d+.* Current matcher uses non-anchoring bounds
입력받은 문자열로 Matcher 객체를 생성한 뒤 useAnchoringBounds(false)를 호출하여 비앵커링 경계로 전환했습니다. 이후 hasAnchoringBounds()가 false를 반환하므로 "non-anchoring bounds" 관련 메시지가 출력됩니다.
예제 2: matches()와 함께 사용하기
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Sample {
public static void main( String args[] ) {
String regex = "^<foo>.*";
String input = "<foo><bar>";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(input);
matcher = matcher.useAnchoringBounds(false);
if(matcher.matches()) {
System.out.println("Match found");
} else {
System.out.println("Match not found");
}
System.out.println("Has anchoring bounds: " + matcher.hasAnchoringBounds());
}
}실행 결과
Match found Has anchoring bounds: false
정규 표현식 ^<foo>.*는 입력 문자열이 <foo>로 시작하는지 검사합니다. useAnchoringBounds(false) 호출 후 matches()를 실행하면 매칭에 성공하며, hasAnchoringBounds()가 false를 반환하는 것을 확인할 수 있습니다.
앵커링 경계가 중요한 이유
앵커링 경계의 차이는 region() 메서드로 검색 영역을 입력 문자열의 일부로 제한했을 때 명확히 드러납니다. 앵커링 경계가 활성화되어 있으면(기본값) 영역의 시작과 끝이 각각 입력 전체의 시작(^)과 끝($)처럼 취급되지만, 비활성화하면 영역 경계에서는 앵커가 매칭되지 않습니다. 부분 문자열 단위의 매칭을 세밀하게 제어해야 하는 경우 이 설정을 적절히 활용하면 됩니다.