자기 자신 매칭하는 패턴
재귀가 패턴이 자기 자신 참조 가능. 고전 사용: 임의 깊이 균형 잡힌 대괄호 매칭, 순수 정규식 (정규 언어) 못 함. 재귀 있으면 정규식이 context-free grammar 영역으로 확장.
문법
(?R)— 전체 패턴 재귀(?N)— group N 재귀(?P>name)또는(?&name)— named 그룹 재귀
균형 잡힌 대괄호 예시
\((?:[^()]++|(?R))*\)
읽기: 여는 괄호, 그 다음 (비-괄호 글자 OR 재귀 괄호 쌍) 어떤 수, 그 다음 닫는 괄호. (?R) 가 전체 패턴 재귀, 그래서 어떤 깊이든 중첩 쌍 매칭.
엔진 지원
- PCRE, PHP, Perl: Yes
- Python
regexthird-party: Yes - Python
re: No - JavaScript, .NET, Ruby, Java, Go: No
재귀가 가장 portable 하지 않은 기능 중 하나. 필요하면 PCRE 에 commit 됐거나 진짜 파서 써야.
경험칙
재귀 정규식 손 뻗으면 문제가 아마 파싱. 진짜 파서가 exotic 정규식 기능 없이 균형 구분자 깨끗히 처리. 코드엔 Python ast, JSON 엔 json, HTML 엔 html.parser, 커스텀 DSL 엔 손으로 쓴 토크나이저. 재귀 정규식 존재; 사용이 보통 도구 전환했어야 했음 의미.