Computer >> 컴퓨터 >  >> 프로그래밍 >> Java

예제로 배우는 Java Matcher hasAnchoringBounds() 메서드 – 앵커링 경계 확인 방법

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)로 전환하면 됩니다.