정규표현식
개요
정규식(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 공격)을 방지하기 위한 설정 방법입니다.
- 템플릿 관리 > 보안 패턴 메뉴로 이동합니다.
- 사용자(USER) 탭을 선택하고 [그룹추가] 버튼을 클릭합니다.
- 아래 [참조 그림 1]과 같이 그룹 정보를 입력합니다.

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

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

