콘텐츠로 이동

정규표현식

개요

정규식(Regular Expression)은 텍스트 문자열에서 특정 패턴을 명시적으로 기술하는 언어입니다. 단순히 패턴을 찾아내는 것뿐만 아니라, 일치하는 항목을 반복 처리하거나, 문자열을 하위 문자열로 파싱하고, 조건에 따라 텍스트를 치환 또는 재구성하는 등 강력한 기능을 제공합니다. 정규식을 활용하면 복잡한 텍스트 처리 작업을 매우 간단하고 효율적으로 해결할 수 있습니다.


단순식 (Simple Expression)

가장 기본적인 정규식은 문자 그대로를 찾는 '리터럴 문자열'입니다. 예를 들어 foo라는 정규식 패턴은 입력 문자열에서 "foo"와 정확히 일치하는 부분을 찾습니다. 이 경우 "The food was quite tasty"라는 문장에도 "foo"가 포함되어 있으므로 일치하는 것으로 간주합니다.

하지만 단순히 동일한 단어를 찾는 것은 정규식의 아주 기초적인 기능일 뿐입니다. 만약 "'f'로 시작하는 모든 단어"를 찾거나 "3글자로 된 단어"만 찾고 싶다면 리터럴 문자열만으로는 불가능합니다. 이러한 복잡한 조건을 처리하기 위해서는 정규식의 더 깊은 기능을 이해해야 합니다. 다음은 리터럴 표현식의 예시입니다.

패턴 입력 (일치항목)
foo foo, food, foot, "There's evil afoot."


한정사 (Quantifiers)

한정사는 패턴 내에서 특정 문자가 몇 번 반복되는지를 지정합니다. 대표적인 비명시적 한정사는 다음과 같습니다.


* : 0회 이상 반복 (없어도 됨)
+ : 1회 이상 반복 (최소 1번 있어야 함)
? : 0회 또는 1회 (있거나 없거나)


한정사는 항상 바로 앞(왼쪽)에 있는 문자를 수식합니다. 만약 여러 문자를 묶어서 반복하려면 괄호 ()를 사용해 그룹화해야 합니다.


패턴 입력 (일치항목)
fo* foo, foe, food, fooot, "forget it", funny, puffy
fo+ foo, foe, food, foot, "forget it"
fo? foo, foe, food, foot, "forget it", funny, puffy

? 문자는 0회 또는 1회 발생을 의미하는 것 외에도, 가능한 가장 적은 문자 수와 일치하도록 하는 '최소 일치(Non-greedy)' 기능을 수행하기도 합니다.
기호로 된 비명시적 한정사 외에, 명시적 한정사인 중괄호 {}를 사용하면 반복 횟수를 구체적으로 지정할 수 있습니다. 예를 들어 x{5}는 'x'가 정확히 5번 반복됨을 의미합니다. 쉼표를 사용하여 x{5,}와 같이 작성하면 '5회 이상'을 의미하며, x{5,8}은 '5회 이상 8회 이하'를 의미합니다.

패턴 입력 (일치항목)
ab{2}c abbc, aaabbccc
ab{,2}c ac, abc, abbc, aabbcc
ab{2,3}c abbc, abbbc, aabbcc, aabbbcc


메타문자 (Metacharacters)

정규식에서 특별한 의미를 갖는 예약어를 메타 문자라고 합니다. 앞서 본 *, ?, +, {} 등이 이에 해당하며, 그 외에도 $, ^, ., [, (, |, ), ], \ 등이 있습니다.

  • . (마침표): 줄바꿈 문자를 제외한 모든 단일 문자와 일치합니다. 특정 길이의 문자열을 찾거나 패턴 중간에 어떤 글자가 와도 상관없을 때 유용합니다.
  • ^ (캐럿)과 $ (달러): 위치를 지정하는 앵커(Anchor)입니다. ^는 문자열의 시작을, $는 문자열의 을 의미합니다. 이를 사용하여 입력값이 특정 패턴과 정확히 일치하는지 검증(유효성 검사)할 수 있습니다.
  • \ (백슬래시): 메타 문자의 특수 기능을 해제하고 문자 그대로(Literal) 인식하게 하거나, 미리 정의된 특수 문자 집합을 호출할 때 사용합니다. 예를 들어, 실제 "c:\"라는 문자열을 찾고 싶다면 ^c:\\와 같이 백슬래시를 두 번 써서 이스케이프 처리를 해야 합니다.
  • | (파이프): "또는(OR)"을 의미합니다. a|b는 "a" 또는 "b"와 일치합니다.
  • ( ) (괄호): 패턴을 그룹화합니다. 한정사를 그룹 전체에 적용하거나, 일치된 부분 문자열을 나중에 재사용하기 위해 사용합니다.

다음은 메타 문자 사용 예시입니다.

패턴 입력 (일치항목)
. a, b, c, 1, 2, 3 (단일 문자)
.* Abc, 123, (빈 문자열 포함 모든 문자열)
^c:\ c:\windows, c:\foo.txt (c:\로 시작하는 문자열)
abc$ abc, 123abc (abc로 끝나는 문자열)
(abc){2,3} abcabc, abcabcabc


문자 클래스 (Character Classes)

문자 클래스는 대괄호 [ ]로 묶어 정의하며, 해당 위치에 올 수 있는 문자들의 집합을 의미합니다. [aeiou]는 모음 중 하나와 일치합니다. 대괄호 안에서는 메타 문자도 일반 문자로 취급되는 경우가 많습니다.

  • 범위 지정 (-): [0123456789] 대신 [0-9]와 같이 하이픈을 사용하여 범위를 간단히 지정할 수 있습니다. 소문자는 [a-z], 대문자는 [A-Z]로 표현합니다.
  • 부정 (^): 대괄호 안에서 첫 문자로 ^가 오면 "해당 문자를 제외하고"라는 뜻입니다. 예: [^0-9]는 숫자가 아닌 모든 문자와 일치합니다. (정규식 시작을 알리는 ^와 다릅니다.)

다음은 문자 클래스 예시입니다.

패턴 입력 (일치항목)
^b[aeiou]t$ Bat, bet, bit, bot, but
^[0-9]{5}$ 11111, 12345, 99999 (5자리 숫자)
^c:\ c:\windows, c:\foo.txt
abc$ abc로 끝나는 모든 문자열
(abc){2,3} abcabc, abcabcabc
^[^-][0-9]$ 0, 1, 2 ... (-0, -1 등 하이픈으로 시작하는 것 제외)


미리 정의된 메타 문자 집합

자주 사용되는 패턴(숫자 전체, 알파벳 전체 등)을 매번 [0-9] 처럼 길게 쓰는 불편함을 줄이기 위해 미리 정의된 단축 표현을 제공합니다. (아래는 .NET Framework 기준이나 대부분의 정규식 엔진에서 유사하게 동작합니다.)

메타 문자 설명
\a 벨(Bell) 문자 (\u0007)
\b 단어의 경계(Word Boundary)와 일치합니다.
\t 탭(Tab) 문자 (\u0009)
\r 캐리지 리턴 (\u000D)
\v 세로 탭 (Vertical Tab, \u000B)
\f 폼 피드 (Form Feed, \u000C)
\n 개행 문자 (New Line, \u000A)
\e ESC 문자 (\u001B)
\040 8진수 ASCII 문자와 일치 (예: \040은 공백)
\x20 16진수 ASCII 문자와 일치 (예: \x20은 공백)
\cC ASCII 제어 문자와 일치 (예: \cC는 Ctrl+C)
\u0020 16진수 유니코드 문자와 일치
\* 메타 문자를 문자 그대로 사용할 때 (예: \*는 리터럴 *)
\w 모든 단어 문자(영문자, 숫자, 밑줄)와 일치 [a-zA-Z0-9_]
\W 단어 문자가 아닌 것과 일치 [^a-zA-Z0-9_]
\s 공백 문자(스페이스, 탭 등)와 일치
\S 공백이 아닌 문자와 일치
\d 숫자(Digit)와 일치 [0-9]
\D 숫자가 아닌 문자와 일치 [^0-9]


샘플 식 (Sample Expressions)

이해를 돕기 위한 몇 가지 정규표현식 예제입니다.

패턴 설명
^\d{5}$ 5자리 숫자 (예: 우편번호)
^(\d{5})|(\d{5}-\d{4})$ 5자리 숫자 또는 '5자리-4자리' 형식 (예: 미국 우편번호)
^\d{5}(-\d{4})?$ 위와 동일하지만 더 효율적인 표현 (그룹화 및 ? 사용)
^[+-]?\d+(\.\d+)?$ 부호가 있을 수 있는 실수 (소수점 포함 가능)
^[+-]?\d*\.?\d*$ 위와 비슷하나 빈 문자열이나 소수점만 있는 경우도 허용
^(20|21|22|23|[01]\d)[0-5]\d$ 24시간제 시간 형식 (HHmm)
/\*.*\*/ C 언어 스타일 주석 (/* ... */)


예제) CC Attack 패턴그룹 추가

DeepFinder에서 헤더 필드(Header Field) 값을 검사하여 CC Attack(Cache-Control 공격)을 방지하기 위한 설정 방법입니다.

  1. 템플릿 관리 > 보안 패턴 메뉴로 이동합니다.
  2. 사용자(USER) 탭을 선택하고 [그룹추가] 버튼을 클릭합니다.
  3. 아래 [참조 그림 1]과 같이 그룹 정보를 입력합니다.

참조 그림1

  1. 정책관리 메뉴로 이동하여, 정책을 적용할 도메인 그룹을 선택합니다.
  2. 마우스 우클릭 후 [정책설정] 메뉴를 클릭합니다.
  3. 헤더필드값정책 > Cache-Control 항목을 선택하고 [정책입력] 버튼을 누릅니다.

참조 그림2

  1. 보안 정책 내용을 입력하고, 대응 방법(차단 등)과 로그 종류를 설정한 후 [확인]을 클릭하여 저장합니다.

참조 그림3

참조 그림4