정규식에서 그룹화는 특정 문자들을 단일 표현식(Single Entity)으로 구분하기 위해 사용한다. 그룹화는 보통 캡처링과 함께 사용하므로 이 둘을 함께 알아두는 것이 좋다.
아래 예시에서 사용한 +
수량자는 1번 이상 반복하는 문자열을 찾는다. 따라서 ab
(b
1번 일치), abb
(b
2번 일치) 등을 모두 일치한다고 판단한다.
const str = 'aabbbababaabb'
str.match(/ab+/g); // ['abbb', 'ab', 'ab', 'abb']
특정 문자 그룹의 반복 여부를 판단하려면 소괄호()
를 사용해 그룹화하면 된다. 그룹화하면 괄호 안 문자를 하나의 단일 표현식으로 정의한다. 아래 예시에선 (ab)
로 묶었으므로 ab
가 1번 이상 반복되는 문자를 찾는다.
const str = 'aabbbababaabb'
str.match(/(ab)+/g); // ['ab', 'abab', 'ab']
<aside>
<img src="/icons/info-alternate_gray.svg" alt="/icons/info-alternate_gray.svg" width="40px" /> 임시 변수(\\1
\\2
등)를 정규식 내에서 다시 호출하는 것을 역참조(Back Reference)라고 부른다
</aside>
캡처화는 괄호로 묶은 단일 표현식을 \\1
\\2
같은 임시 변수에 저장한 후 참조할 수 있는 것을 말한다. 변수는 밖 → 안, 좌 → 우 순서로 저장한다(정규식 실행 순서). 아래 예시에서 \\1
변수엔 a
, \\2
변수엔 b
를 저장했으므로 abab
와 일치하는 문자열을 찾는다.
const str = 'aabbbababaabb'
str.match(/(a)(b)\\1\\2/); // ['abab', 'a', 'b', index: 5, input: 'aabbbababaabb', groups: undefined]
str.match
메서드에 캡처 그룹이 있으면, 전체 정규식 실행 결과값과 캡처 그룹 결과값을 함께 포함한다.
str.match
결과값 : 'abab'
\\1
결과값 : 'a'
\\2
결과값 : 'b'
아래 예시에선 \\1
변수에 그룹화한 문자 ab
를 저장했다. (ab)\\1
→ (ab)(ab)
이므로 abab
를 찾는다.
const str = 'aabbbababaabb'
str.match(/(ab)\\1/); // ['abab', 'ab', index: 5, input: 'aabbbababaabb', groups: undefined]
소괄호를 사용해 그룹화하면 그룹화됨과 동시에 캡처화가 이뤄진다. 그룹화만 필요하고 캡처화가 필요 없다면 괄호 안쪽 시작 지점에 ?:
를 추가해서 캡처화를 방지할 수 있다.