복잡한 정규 표현식 마스터하기
정규식(regex)은 패턴 일치 및 텍스트 조작을 위한 다목적 도구입니다. 이 튜토리얼에서는 복잡한 텍스트 처리 시나리오를 보다 효과적으로 관리하는 데 도움이 되는 고급 정규식 기술을 살펴봅니다.
Lookbehind 어설션
Lookbehind 어설션을 사용하면 패턴 앞에 다른 패턴이 있는 경우에만 패턴을 일치시킬 수 있습니다. 이는 일치 항목에 포함하지 않고 컨텍스트를 확인하는 데 유용합니다.
- 긍정적인 뒷모습
(?<=...)
: 지정된 표현식이 앞에 오는 경우에만 패턴과 일치합니다. - 부정 Lookbehind
(?<!...)
: 지정된 식이 앞에 오지 않는 경우에만 패턴과 일치합니다.
예:
(?<=Mr\.|Mrs\.)\s[A-Z]\w+
이 정규식은 "Mr." 또는 "Mrs."가 앞에 오는 이름과 일치합니다.
조건부 패턴
조건부 패턴을 사용하면 특정 조건 충족 여부에 따라 다양한 패턴을 일치시킬 수 있습니다. 구문은 (?(조건)true-pattern|false-pattern)
입니다.
예:
(\d{3}-)?\d{3}-\d{4}
이 정규식은 지역 번호가 있거나 없는 전화번호와 일치합니다.
서브루틴과 재귀
서브루틴과 재귀를 사용하면 동일한 정규식 내에서 패턴을 재사용하거나 중첩 구조를 일치시킬 수 있습니다. 이는 복잡하고 중첩된 데이터에 특히 유용합니다.
예:
(?<group>\((?>[^()]+|(?&group))*\))
이 정규식은 균형 잡힌 괄호를 중첩된 수준과 일치시킵니다.
소유 수량자
소유 수량자는 정규식 엔진의 역추적을 방지하여 역추적이 발생하지 않도록 하려는 경우 성능을 향상시킬 수 있습니다.
예:
\w++
이 정규식은 일련의 단어 문자를 소유 방식으로 일치시킵니다. 즉, 일단 일치하면 문자를 포기하지 않습니다.
향상된 일치를 위해 플래그 사용
정규식 플래그는 패턴 일치 동작을 수정합니다. 몇 가지 일반적인 플래그는 다음과 같습니다.
- 'i': 대소문자를 구분하지 않는 일치입니다.
- 'm': 여러 줄 모드,
^
및$
의 동작에 영향을 미칩니다. - 's': Dotall 모드,
.
이 개행 문자와 일치하도록 허용합니다. - 'x': 공백을 무시하고 가독성을 위해 패턴 내에서 주석을 허용합니다.
예:
/pattern/imsx
이 패턴은 대소문자 구분, 여러 줄, 도트 및 확장 모드를 적용합니다.
프로그래밍 언어의 예
다음은 Python 및 JavaScript에서 고급 정규식을 사용하는 몇 가지 예입니다.
파이썬 예제
import re
# Match a name preceded by Mr. or Mrs.
pattern = r'(?<=Mr\.|Mrs\.)\s[A-Z]\w+'
text = 'Mr. Smith and Mrs. Johnson'
matches = re.findall(pattern, text)
for match in matches:
print('Match found:', match)
자바스크립트 예
// Match a name preceded by Mr. or Mrs.
const pattern = /(?<=Mr\.|Mrs\.)\s[A-Z]\w+/g;
const text = 'Mr. Smith and Mrs. Johnson';
const matches = text.match(pattern);
if (matches) {
matches.forEach(match => console.log('Match found:', match));
}
결론
Lookbehind 어설션, 조건부 패턴, 서브루틴, 재귀 및 소유 수량자와 같은 고급 정규식 기술은 복잡한 텍스트 처리를 위한 정규식 기능을 확장합니다. 이러한 개념을 익히면 정교한 일치 및 조작 작업을 보다 효율적이고 정확하게 처리할 수 있습니다.