본문 바로가기

WEB_Programming/Pure Java

Regular Expression > Capturing Groups


이전 섹션에서 어떻게 수량 지정자를 하나의 문자, character class와 capturing group에 지정하는지에 대해서 알아 보았다. 그러나 지금까지 우리는 capturing group에 대해서 상세하게 논의하지 않았다.

Capturing groups 은 하나의 유닛으로 복수의 문자를 다룬다. 이러한 방법은 ()로 문자 그룹을 둘러 쌓면 된다. 예를 들어 정규식 (dog)는 하나의 그룹으로 "d" "o" "g"를 연속적으로 입력하면 된다. 입력 문자의 부분 캡쳐링 그룹으로 묶고 이것을 메모리에 저장한 후 다음에 다시 backreferences를 이용하여 다시 호출할 수 있다. 이것은 이번 섹션 마지막에서 Backreferences를 이용하여 처리한다.

Numbering

Pattern API에서 묘사한, 캡쳐링 그룹은 왼쪽에서 오른쪽으로 괄호 수대로 그룹의 내용을 알 수 있다. 예제에서 ((A)(B(C)))  의 경우 그룹은 다음과 같은 내용들을 검사하게 된다.
  1. ((A)(B(C)))
  2. (A)
  3. (B(C))
  4. (C)
얼마나 많은 그룹이 표현식에 포함되어 있는지 알기를 위해서는 groupCount 메소들르 매처 객체에서 호출하여 처리할 수 있다. groupCount 메소드는 int형식으로 매처 패턴에 사용한 캡쳐링 그룹의 수를 보여준다. 이 예에서는 groupCount는 4를 반환하며, 패턴에는 4개의 Capturing Group를 가지고 잇음을 나타낸다.

여기에는 또한 특별 그룹이 있다. group 0은 항상 전체 표현식을 표현한다. 이 그룹은 groupCount에 의해서 리포트된 총 내용을 포함하지는 않는다. Groups는 ( ? 시작하는것이 기본이다. non-capturing groups는 텍스트를 캡쳐하지 않고, 그룹 전체의 개수를 카운트 하지 않는다. (non-capturing groups는 차후에 Methods of the Pattern Class에서 다룬다.)

중요하게 이해해야할 부분은 어떻게 그룹의 넘버링 되었는지이며, 이것은 Matcher 메소드에 파라미터로 특정 그룹의 번호를 전달해서 값을 획득하기 때문이다.

  • public int start(int group): 이것은 이전 매치작업을 통해서 주어진 그룹에 의해서 캡쳐된 부분의 시작 인덱스를 반환한다.

  • public int end (int group): 마지막 인덱스를 반환한다. 이전 매치 작업하는동안 주어진 그룹에 의해서 캡쳐된 부분에서 하나 증가된 값을 반환한다.

  • public String group (int group): 이전 매치 작업을 수행하는 동안 주어진 그룹에 의해서 캡쳐된 부분을 반환한다.

Backreferences

입력된 문자에 매칭되는 캡쳐링 그룹의 영역은 나중에 backreference를 통해서 호출할 수 있도록 메모리에 저장된다. backreference는 정규식 표현에서 백슬레시를 지정한 것으로 재 호출된 그룹의 숫자를 나타낸다. 예를 들어 표현식을 (\d\d)로 정의한다면 하나의 캡쳐 그룹은 하나의 로에서 두개의 숫자에 매치 된다 이것은 차후에 backreference인 \1을 통해서 표현할 수 있다.

어떠한 2개의 매치값이 다음과 같이 정확히 동일하다면 (\d\d)\1라는 정규식 표현을 이용할 수 있다.

Enter your regex: (\d\d)\1

Enter input string to search: 1212

I found the text "1212" starting at index 0 and ending at index 4.

만약 마지막 두개의 값을 변경한다면 매치 작업은 실패할 것이다.

Enter your regex: (\d\d)\1

Enter input string to search: 1234

No match found.

포함된 캡쳐링 그룹을 위해서 backreferencing 작업은 정확하게 동일한 방법으로 처리된다. 숫자에 백슬레쉬를 취한 그룹은 재호출 된다.