1. [정규표현식 메타문자] 서브 패턴 (subexpression) (그룹화) (캡처그룹, capture group) : ( )
ㅇ 서브 패턴 또는 캡처에 의한 캡처 그룹화는, 부분을 감싸서 구별짓고, 기억하여, 이를 활용키 위함
- 例) color 또는 colour 매치하려면, col(o|ou)r
. 여기서, 캡처를 지시하는 괄호 (pattern)는,
. 캡처 그룹(capture group)을 만들어, 이를 통해 매칭된 내용을 기억, 활용코자하는 것임
2. [정규표현식 메타문자] 둥근괄호(parenthesis) `( )`에 의한 그룹화의 주요 역할
ㅇ 연산 우선순위 명시 (그룹화)
- `|(또는), *, +, ?, {m,n}` 등이 섞여 있을 때,
- 괄호 ( )를 사용하여 적용 범위를 한정하고, 우선순위를 명확히 함
ㅇ 일차한 문자열 저장 활용 (캡처)
* ( )로 묶인 부분은 캡처 그룹이 되어, 매칭된 문자열을 자동으로 기억하고 재활용 가능
- 부분 문자열 저장
. 정규 표현식 엔진이 ( )에 일치한 내용을 임시로 저장
- 이를통해, 부분 문자열 (서브 패턴) 위주의 탐색 등
. 다양하게 서브 패턴을 만들어 재활용 할 때 유용
.. 즉, 일치한 문자열 (서브 패턴, 그룹)의 저장 (캡처) 및 재활용
- 그룹 재활용 (backreference, 역참조)
. 매칭 결과의 임시 저장 후, 번호(수량자)를 붙여, 다시 불러쓸 수 있음
.. 그룹으로 묶은 패턴의 검사 결과 뒤에, 수량자를 붙여, 어떤 추가 작업에 활용 가능
- 수량자와 함께 활용
. 例) (abc)+ → abc가 1번 이상 반복되는 패턴
- 검사 결과의 저장 또는 비 저장 선택 가능 ☞ 아래 3.번항 참조
- 탐색 방향을 달리 정할 수 있음 ☞ 아래 4.번항 참조
3. [정규표현식 메타문자] 그룹화 검사 결과의 저장(캡처) 또는 비 저장(논 캡처,비 참조) 구분
ㅇ 기본적인 그룹화 : (), (?:)
- 매치 결과를 `캡처(저장)하는` 그룹화, ()
- 매치 결과를 `캡처(저장)하지 않는` 그룹화, (?: ) 또는 (\% \)
. 例) (?: ) 사용 시, 비캡처 그룹(non-capturing group) 으로,
.. 단순히 그룹화만 하고 저장은 하지 않음.
4. [정규표현식 메타문자] 탐색 방향까지도 지정 가능한, 그룹화 기능의 확장
※ 통상의 정규표현식은, 텍스트를 매칭하여 반환하지만,
- 때때로, 매칭할 텍스트의 위치 만을 표시하고 싶을 때가 있음
. 문자열 자체가 아닌 위치에 일치시키고, 일치 결과의 위치를 반환함
. 이때, 반환되는 문자가 없으므로, 반환 길이는 0 임
- 이로부터, 탐색 방향(전방 탐색,후방 탐색)의 결정이 가능하게 됨
- 한편, 그룹화 안에, 리터럴(문자열)이나 메타문자를 포함할 수 있음
ㅇ 긍정형 전방탐색 (positive lookahead) : (?=)
- 전방 탐색 문자열 (?=regex)인 위치로부터 앞에서(순방향) 찾음
. 例) 1000원 => .+(?=원) => 1000
. 例) http://www.example.com => .+(?=:) => http
. 例) abracadabra => a(?=..a) => abracadacra : 처음`abra` 및 끝`acra`
ㅇ 부정형 전방탐색 (negative lookahed) : (?!)
- 전방탐색 문자열 (?!regex)이 아닌 위치로부터 앞에서(순방향) 찾음
. 例) hello world helloabc hello123 => hello(?!abc)
=> hello world helloabc hello123
.. `hello world`,`hello123`은 매칭되지만, `helloabc`는 비 매칭
ㅇ 긍정형 후방탐색 (positive lookbehind) : (?<=)
- 후방탐색 문자열 (?<=regex)인 위치로부터 뒤에서(후방향) 찾음
. 例) Price: USD100 => (?<=USD)\d+ => 100
.. (?<=USD) 뒤에서 하나 이상의 숫자(100)를 찾음
ㅇ 부정형 후방탐색 (negative lookbehind) : (?<
!)
- 후방탐색 문자열 (?<
!regex)이 아닌 위치로부터 뒤에서(후방향) 찾음
. 例) abc로 끝나지 않은 단어 찾기
.. xyz123 xyzabc xyzdef => \w+(?<
!abc)\b => xyz123 xyzdef
※ 단, 자바스크립트 언어는, 후방 탐색을 지원 안함