Matcher — 패턴 매칭 엔진
Matcher — 패턴 매칭 엔진
Matcher는 Pattern을 해석해 문자 시퀀스에 대해 매칭 연산을 수행하는 엔진이에요. 패턴의 matcher 메서드를 호출해 패턴에서 만들어져요. MatchResult 인터페이스를 구현해요.
본문
public final class Matcher extends Object implements MatchResult
한 번 만들어지면 세 가지 매칭 연산을 수행할 수 있어요.
matches()— 입력 시퀀스 전체가 패턴과 일치하는지 시도해요.lookingAt()— 입력 시퀀스에서 처음부터 패턴과 일치하는지 시도해요.find()— 다음 부분 시퀀스가 패턴과 일치하는지 스캔해요.
각 메서드는 성공 여부를 나타내는 boolean을 반환해요. matcher는 입력의 일부인 region(영역) 이라는 부분 집합에서 일치를 찾아요. 기본적으로 region은 전체 입력을 포함하며 region 메서드로 바꾸고 regionStart/regionEnd로 조회할 수 있어요.
appendReplacement/appendTail 메서드는 일치한 부분 시퀀스를 새 문자열로 교체해 기존 버퍼/빌더에 모으는 데 함께 쓸 수 있어요. 더 편리한 replaceAll은 입력의 모든 일치 부분을 교체한 문자열을 만들어요.
상태와 그룹
matcher의 명시적 상태는 가장 최근 성공 매치의 시작·끝 인덱스와, 패턴의 각 캡처링 그룹이 캡처한 입력 부분 시퀀스의 시작·끝 인덱스 및 그 개수를 포함해요.
start()/start(int group)/start(String name)— 이전 매치 또는 그룹 캡처의 시작 인덱스를 반환해요.end()/end(int group)/end(String name)— 마지막 일치 문자의 다음 오프셋을 반환해요.group()/group(int group)/group(String name)— 이전 매치에 의해 일치/캡처된 입력 부분 시퀀스를 반환해요. 그룹이 매치되지 않았으면null을 반환해요.groupCount()— 캡처링 그룹 수를 반환해요(그룹 0은 전체 패턴이라 포함하지 않아요).namedGroups()— 캡처링 그룹 이름을 그룹 번호로 매핑한 수정 불가능한 맵을 반환해요.hasMatch()— 이전 매치/find 연산에서 유효한 매치가 있는지 반환해요.toMatchResult()— 이 matcher의 매치 상태를MatchResult로 반환해요.
매칭 메서드
matches()— 전체 region이 패턴과 일치하는지 시도해요.find()— 다음 부분 시퀀스가 패턴과 일치하는지 찾아요.find(int start)— 지정 인덱스에서 찾기 시작하고 matcher를 리셋해요.lookingAt()— region의 시작에서 패턴과 일치하는지 시도해요(전체 region이 필요하진 않아요).
리셋과 패턴
pattern()/usePattern(Pattern)— 해석하는 패턴을 반환하거나 교체해요.reset()/reset(CharSequence)— 상태를 버리고 추가 위치를 0으로 되돌려요.region은 기본(전체)으로 되돌아가요.
region 제어
region(int start, int end)— region의 한계를 설정해요.regionStart()/regionEnd()— region의 시작/끝 인덱스를 반환해요.hasTransparentBounds()/useTransparentBounds(boolean)— region 경계의 투명성을 조회/설정해요. 투명 경계에서는 lookahead/lookbehind/경계 매칭 구문이 region 밖을 볼 수 있어요(기본은 불투명).hasAnchoringBounds()/useAnchoringBounds(boolean)— region 경계가^/$같은 앵커와 일치하는지 조회/설정해요(기본은 anchoring).
교체
quoteReplacement(String)— 리터럴 교체 문자열을 반환해요(백슬래시·달러 표시를 특별하게 취급하지 않음).appendReplacement(StringBuffer/StringBuilder, String)— 이전 매치 전까지의 문자와 교체 문자열을 버퍼에 추가하고 추가 위치를end()로 옮겨요. 교체 문자열은$g/${name}처럼 캡처 그룹 참조를 포함할 수 있어요.appendTail(StringBuffer/StringBuilder)— 남은 입력을 버퍼에 복사해요.replaceAll(String)/replaceAll(Function<MatchResult, String>)— 모든 일치를 교체해요.replaceFirst(String)/replaceFirst(Function<MatchResult, String>)— 첫 일치만 교체해요.results()— 패턴과 일치하는 각 부분 시퀀스의 매치 결과 스트림을 반환해요(fail-fast).
기타
toString() — 디버깅에 유용한 문자열 표현을 반환해요. hitEnd() — 마지막 검색에서 입력 끝에 도달했는지, requireEnd() — 더 많은 입력이 매치를 바꿀 수 있는지 반환해요.