java.util.regex.Matcher 클래스는 입력 문자열에 대해 다양한 매칭 작업을 수행하는 엔진입니다. 이 클래스에는 별도의 생성자가 없으며, java.util.regex.Pattern 클래스의 matcher() 메서드를 호출하여 Matcher 객체를 생성할 수 있습니다.
앵커링 경계(anchoring bounds)는 매칭 영역(region)의 경계에서 ^(시작)와 $(끝) 같은 앵커가 동작하도록 하는 설정입니다. 기본적으로 Matcher는 앵커링 경계를 사용하며, useAnchoringBounds() 메서드를 호출하면 비앵커링 경계(non-anchoring bounds)로 전환할 수 있습니다.
hasAnchoringBounds() 메서드는 현재 Matcher 객체가 앵커링 경계를 사용하고 있는지 확인합니다. 앵커링 경계를 사용 중이면 true, 그렇지 않으면 false를 반환합니다.
hasAnchoringBounds() 메서드 문법
public boolean hasAnchoringBounds()
- 매개변수: 없음
- 반환값: 현재 Matcher가 앵커링 경계를 사용하면 true, 비앵커링 경계를 사용하면 false
- 예외: 발생하지 않음
예제 1 – 기본 사용법
다음 예제에서는 정규 표현식으로 Matcher 객체를 생성한 뒤, hasAnchoringBounds() 메서드로 앵커링 경계 설정 여부를 확인합니다.
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class HasAnchoringBoundsExample {
public static void main(String[] args) {
String regex = "(.*)(\\d+)(.*)";
String input = "This is a sample Text, 1234, with numbers in between. "
+ "\n This is the second line in the text "
+ "\n This is third line in the text";
// 패턴 객체 생성
Pattern pattern = Pattern.compile(regex);
// Matcher 객체 생성
Matcher matcher = pattern.matcher(input);
// 앵커링 경계 사용 여부 확인
boolean bool = matcher.hasAnchoringBounds();
// 결과 출력
if(bool) {
System.out.println("현재 Matcher는 앵커링 경계를 사용합니다");
} else {
System.out.println("현재 Matcher는 비앵커링 경계를 사용합니다");
}
// 매칭 결과 확인
if(matcher.matches()) {
System.out.println("매칭 성공");
} else {
System.out.println("매칭 실패");
}
}
}
출력 결과
현재 Matcher는 앵커링 경계를 사용합니다
매칭 실패
Matcher는 기본값인 앵커링 경계를 사용합니다. 한편 입력 문자열에 줄바꿈(\n)이 포함되어 있고, 점(.)은 기본적으로 줄바꿈 문자와 매칭되지 않기 때문에 전체 매칭(matches())은 실패합니다.
예제 2 – useAnchoringBounds()와 함께 사용하기
이번 예제에서는 useAnchoringBounds(false)를 호출해 비앵커링 경계로 전환한 후, hasAnchoringBounds() 메서드로 변경된 설정을 확인합니다.
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("문자열을 입력하세요");
String input = sc.nextLine();
// 숫자를 찾기 위한 정규 표현식
String regex = ".*\\d+.*";
// 정규 표현식 컴파일
Pattern pattern = Pattern.compile(regex);
// 컴파일된 정규 표현식 출력
System.out.println("컴파일된 정규 표현식: "+pattern.toString());
// Matcher 객체 생성
Matcher matcher = pattern.matcher(input);
// 비앵커링 경계로 전환
matcher.useAnchoringBounds(false);
boolean hasBounds = matcher.hasAnchoringBounds();
if(hasBounds) {
System.out.println("현재 Matcher는 앵커링 경계를 사용합니다");
} else {
System.out.println("현재 Matcher는 비앵커링 경계를 사용합니다");
}
// 매칭 여부 확인
if(matcher.matches()) {
System.out.println("입력한 문자열에 숫자가 포함되어 있습니다");
} else {
System.out.println("입력한 문자열에 숫자가 포함되어 있지 않습니다");
}
}
}
출력 결과
문자열을 입력하세요
hello sample 2
컴파일된 정규 표현식: .*\d+.*
현재 Matcher는 비앵커링 경계를 사용합니다
입력한 문자열에 숫자가 포함되어 있습니다
정리
hasAnchoringBounds() 메서드는 Matcher의 경계 설정 상태를 간편하게 확인할 수 있는 진단용 메서드입니다. 지역(region) 기반 매칭에서 ^나 $ 같은 앵커가 영역 경계에서 동작해야 한다면 기본 설정인 앵커링 경계를 그대로 사용하고, 영역 경계를 단순한 문자열 경계로만 취급하고 싶다면 useAnchoringBounds(false)로 전환하면 됩니다.