정규 표현식의 대소문자 구분 안 함 이해하기

정규 표현식(정규식)은 패턴 매칭과 문자열 조작을 위한 강력한 도구입니다. 정규식을 사용할 때 흔히 필요한 사항은 특정 문자에 대해 대소문자를 무시하고 다른 문자에 대해서는 대소문자를 구분하는 것입니다. 이 블로그 포스트에서는 정규식에서 선택적으로 대소문자 구분 안 함을 구현하는 방법을 탐구하여 패턴 매칭의 유연성을 높이는 방법을 소개합니다.

문제

예를 들어 문자열에 다양한 대소문자가 포함되어 있다고 가정해 보겠습니다:

fooFOOfOoFoOBARBARbarbarbAr

“foo"를 대소문자에 상관없이 매치하고 싶지만, 대문자 “BAR"만 매치하고 싶다고 가정해 보겠습니다. 문제는 정규식 패턴의 일부만 대소문자 구분 안 함으로 만들고 나머지는 대소문자를 구분하도록 유지하는 방법을 찾는 것입니다.

일반적인 정규식 대소문자 구분 안 함 접근 방식

정규식 패턴은 일반적으로 애플리케이션 전체 또는 패턴 수준의 수정자로 인해 완전히 대소문자 구분 안 함으로 만들어집니다. 그러나 초기 질문에서 제기했듯이, 이는 항상 바람직하지는 않습니다.

해결책: 인라인 모드 변경

패턴 수정자 사용하기

Perl과 같은 언어에서는 정규식 패턴의 특정 섹션에 대해 대소문자 구분 안 함을 지정할 수 있습니다. (?i:) 수정자를 사용하여 이를 수행할 수 있습니다. 사용 방법은 다음과 같습니다:

  1. 인라인 수정자: 대소문자 구분 안 함으로 만들고자 하는 정규식의 세그먼트 앞에 (?i:)를 삽입합니다.
  2. 수정자 끄기: 대소문자 구분으로 되돌리려면 (?-i) 수정자를 사용할 수 있습니다.

예제

주어진 문자열에 대해 다음과 같은 정규식을 작성할 수 있습니다:

(?i)foo*(?-i)|BAR

이 표현식에서:

  • (?i)는 정규식의 “foo” 부분을 대소문자 구분 안 함으로 만듭니다.
  • (?-i)는 파이프(|) 구분자까지 따라오는 모든 것에 대해 다시 대소문자 구분으로 전환합니다. 이 파이프는 다른 정규식 패턴의 시작을 나타냅니다.

언어별 정규식 지원

  • 인라인 수정자 지원:

    • Perl
    • PHP
    • .NET
  • 인라인 수정 불가:

    • JavaScript
    • Python

JavaScript와 Python에서는 모든 수정자가 전체 표현식에 적용되므로, 활성화 후 모드를 끌 수 있는 방법이 없습니다.

정규식 테스트하기

다음과 같은 간단한 예제를 사용하여 정규식 변형이 모드 수정자를 처리하는 방식을 테스트할 수 있습니다:

(?i)te(?-i)st

이것은 다음과 일치합니다:

  • test
  • TEst

그러나 일치하지 않습니다:

  • teST
  • TEST

결론

정규식에서 인라인 모드 변경을 활용하면 대소문자 민감도에서 유연성을 제공하여 패턴 매칭을 향상시킬 수 있습니다. Perl 및 PHP와 같은 일부 언어는 이러한 미세한 수정을 허용하지만, JavaScript 및 Python과 같은 언어는 보다 전역적인 접근 방식을 enforced합니다.

정규식 수정자에 대한 보다 자세한 정보는 정규 표현식 정보와 같은 추가 자료를 참고하시기 바랍니다.

올바른 접근 방식을 취하면 강력하고 정밀한 정규식 패턴을 성공적으로 만들 수 있으며, 필요한 대로 대소문자 민감도를 처리할 수 있습니다.