복잡한 정규 표현식 마스터하기

정규식(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 어설션, 조건부 패턴, 서브루틴, 재귀 및 소유 수량자와 같은 고급 정규식 기술은 복잡한 텍스트 처리를 위한 정규식 기능을 확장합니다. 이러한 개념을 익히면 정교한 일치 및 조작 작업을 보다 효율적이고 정확하게 처리할 수 있습니다.