한 번 확정한 매칭으로 돌아가지 않는 그룹
원자 그룹 (?>...)은 안쪽 패턴을 매칭한 뒤 그 그룹 내부로 다시 백트래킹하지 않아. 뒤의 패턴이 실패해도 이미 소비한 문자를 돌려주거나 그룹 안의 다른 대안을 다시 시도하지 않는다는 뜻이야.
백트래킹 경우의 수를 줄일 수 있어
^([a-z]+)*X는 끝에 X가 없는 긴 소문자 문자열에서 반복 구간을 나누는 여러 방법을 시도할 수 있어. 중첩 수량자가 만드는 모호한 분할은 파국적 백트래킹의 대표적인 원인이야.
^(?>[a-z]+)*X처럼 안쪽을 원자 그룹으로 만들면 이미 잡은 소문자 구간을 다시 나누지 않아. 다만 원자 그룹은 매칭 결과도 바꿀 수 있으므로, 뒤의 패턴을 위해 문자를 돌려줄 필요가 없다는 사실을 확인한 뒤 사용해야 해.
엔진마다 지원 여부가 달라
- Python
re: Python 3.11부터 지원해. 이전 버전의 내장re에서는 사용할 수 없어. - PCRE, Perl, Java, Ruby, .NET: 지원해.
- JavaScript: 원자 그룹 문법을 지원하지 않아.
- RE2와 Go
regexp: 백트래킹 엔진이 아니므로 이 문법을 지원하지 않아.
사용하기 전에 의미를 확인해
원자 그룹은 단순한 속도 표지가 아니라 백트래킹 선택지를 없애는 문법이야. 일반 그룹과 원자 그룹을 각각 성공해야 하는 입력, 실패해야 하는 입력, 긴 입력에 테스트하고 의미가 그대로인지 확인해.