정규식의 고급 개념
정규식(regex)은 패턴 일치 및 텍스트 조작을 위한 강력한 도구입니다. 기본 사항을 숙지하고 나면 고급 개념을 자세히 살펴보면 복잡한 시나리오를 효율적으로 처리하는 능력이 크게 향상될 수 있습니다.
Lookahead 및 Lookbehind 어설션
Lookahead 및 Lookbehind 어설션은 일치하는 패턴을 결과에 포함하지 않고 다른 패턴이 뒤따르는(또는 그렇지 않은) 경우에만 패턴을 일치시킬 수 있는 고급 기능입니다.
- 긍정적 예측
(?=...)
: 다른 패턴이 뒤에 오는 경우에만 이전 패턴과 일치합니다. - 부정 예측
(?!...)
: 뒤에 다른 패턴이 오지 않는 경우에만 이전 패턴과 일치합니다. - 긍정적인 뒤돌아보기
(?<=...)
: 다음 패턴 앞에 다른 패턴이 있는 경우에만 다음 패턴과 일치합니다. - 부정 뒤돌아보기
(?<!...)
: 다음 패턴 앞에 다른 패턴이 없는 경우에만 다음 패턴과 일치합니다.
예:
\b\w+(?=ing\b)
이 정규식은 "ing"로 끝나는 단어와 일치하지만 "ing" 앞 부분만 캡처합니다.
비캡처 그룹
비캡처 그룹을 사용하면 일치하는 하위 문자열을 캡처하지 않고도 패턴을 그룹화할 수 있습니다. (?:...)
로 표시됩니다.
예:
\b(?:Mr|Ms|Mrs)\.?\s[A-Z]\w*
이 정규 표현식은 Mr., Ms. 또는 Mrs.와 같은 직함 뒤에 대문자 이름이 오는 것과 직함을 별도로 캡처하지 않고 일치시킵니다.
재귀 패턴
재귀 패턴을 사용하면 정규 표현식이 임의로 깊이가 있을 수 있는 중첩 구조와 일치할 수 있습니다. 이는 PCRE(Perl Compatible Regular Expressions)와 같은 재귀를 지원하는 정규식 엔진을 통해 달성됩니다.
예:
(?\((?>[^()]+|(?&group))*\))
이 정규식은 중첩된 괄호와 일치하여 임의로 깊은 중첩 수준을 처리합니다.
유니코드 및 여러 줄 모드
유니코드 모드를 사용하면 정규식에서 유니코드 문자를 적절하게 처리할 수 있으므로 다양한 언어와 스크립트에서 패턴 일치가 가능해집니다.
여러 줄 모드는 ^
및 $
과 같은 앵커의 작동 방식에 영향을 미치므로 전체 문자열의 시작과 끝이 아닌 각 줄의 시작과 끝과 일치하게 됩니다.
성능 고려 사항
정규식 성능은 비효율적인 패턴이나 큰 입력 크기로 인해 영향을 받을 수 있습니다. 패턴 최적화, 컴파일된 정규식 개체 사용(지원되는 경우), 불필요한 역추적 방지와 같은 기술을 사용하면 성능을 향상시킬 수 있습니다.
결론
고급 정규식 개념을 익히면 복잡한 텍스트 처리 작업을 효과적으로 처리할 수 있습니다. 미리보기/뒤돌아보기 어설션, 비캡처 그룹, 재귀 패턴, 유니코드 지원 및 성능 최적화를 이해함으로써 프로젝트에서 정규 표현식의 잠재력을 최대한 활용할 수 있습니다.