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

예제로 배우는 Java Matcher의 useAnchoringBounds() 메서드

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() 메서드로 검색 영역을 입력 문자열의 일부로 제한했을 때 명확히 드러납니다. 앵커링 경계가 활성화되어 있으면(기본값) 영역의 시작과 끝이 각각 입력 전체의 시작(^)과 끝($)처럼 취급되지만, 비활성화하면 영역 경계에서는 앵커가 매칭되지 않습니다. 부분 문자열 단위의 매칭을 세밀하게 제어해야 하는 경우 이 설정을 적절히 활용하면 됩니다.