C# Regex 사용법을 알아보도록 합시다.

C# 정규표현식, 즉 Regex에 대해 초급 개념부터 단계적으로 살펴보도록 합시다. 실습할 수 있는 예제도 준비해 보았어요.

1. 정규 표현식의 기초: 기본 개념 및 패턴 이해

정규 표현식의 기본 개념과 문법을 이해하고, C#에서 어떻게 사용하는지 익혀 보아요.

1.1 정규 표현식이란?

정규 표현식은 문자열에서 특정 패턴을 찾거나, 문자열을 특정 형식으로 분리 또는 검증할 때 사용하는 강력한 도구입니다. 간단히 말해, 패턴을 정의하고 그 패턴에 일치하는 문자열을 찾는 것입니다.

1.2 정규 표현식의 기본 구조

정규 표현식의 기본 문법을 알아보면 다음과 같습니다.

  • .: 임의의 한 문자
  • ^: 문자열의 시작
  • $: 문자열의 끝
  • []: 문자 클래스
  • \d: 숫자, 대문자 (\D는 반대로 '숫자가 아닌 것'을 뜻합니다. \d의 반대)
  • \w: 알파벳 또는 숫자(단어 문자) (마찬가지로 \W는 \w의 반대 표현식과 일치)
  • +, *, ?: 반복을 나타내는 연산자, (+ → 1개 이상), (* → 0개 이상), (? → 0 이거나 1)

예시

using System;
using System.Text.RegularExpressions;

class Program
{
    static void Main()
    {
        string pattern = @"\d+";  // 숫자 하나 이상 찾기
        string input = "abc123def456";

        Match match = Regex.Match(input, pattern);
        while (match.Success)
        {
            Console.WriteLine($"Found '{match.Value}' at index {match.Index}");
            match = match.NextMatch();
        }
    }
}

이 예제는 숫자가 포함된 문자열에서 숫자 패턴을 찾아내는 아주 기초적인 예입니다. 출력 결과는 숫자 하나 이상을 찾기 때문에 다음과 같답니다.

Found '123' at index 3
Found '456' at index 9

2. 특수 문자 및 메타문자

정규 표현식에서 자주 사용하는 특수 문자와 메타문자를 이해하고 적용해보겠습니다.

정규 표현식에서 여러 상황에서 유용하게 쓰이는 특수 문자는 매우 중요합니다. 메타문자는 정규 표현식에서 패턴의 의미를 변경하거나 추가 기능을 제공하는데, 이번에 다루는 주요 특수 문자는 다음과 같습니다~

  • .: 임의의 문자 하나
  • \: 특수 문자를 이스케이프하여 문자 그대로 사용
  • []: 문자 집합, 예: [a-z]는 소문자 a부터 z까지의 문자
  • ^: 문자열의 시작
  • $: 문자열의 끝
  • |: OR 연산자, 예: abc|xyzabc 또는 xyz와 일치

예시

string pattern = @"^abc";  // 'abc'로 시작하는 패턴
string input = "abc123";
Match match = Regex.Match(input, pattern);
Console.WriteLine(match.Success);  // true

이 예제는 문자열이 'abc'로 시작하는지 확인하는 매우 간단한 패턴 매칭을 보여줍니다. "abc123"은 "abc"로 시작하므로 true랍니다.

3. 그룹화와 캡처

정규 표현식에서 그룹화를 사용해 패턴 내에서 특정 부분을 캡처하고, 이를 활용해 보아요.

3.1 그룹화

그룹화를 통해 패턴 내의 특정 부분을 묶고, 그 부분을 재사용하거나 참조할 수 있습니다. 이를 통해 복잡한 패턴을 간결하게 만들 수 있습니다.

  • (): 그룹화
  • |: OR 연산
  • (?:...): 캡처하지 않는 그룹
  • (?<name>...): 그룹을 'name' 이라는 이름으로 캡처합니다. 그룹넘버뿐만 아니라 이름으로도 접근할 수 있어요.

3.2 그룹 캡처와 참조

정규 표현식에서 그룹을 캡처하면, 매칭된 부분을 다시 사용할 수 있습니다. 특히, 복잡한 패턴에서 유용하게 쓰입니다.

예시

string pattern = @"(\d{3})-(\d{2})-(?<안녕하세요>\d{4})";
string input = "123-45-6789";

Match match = Regex.Match(input, pattern);
if (match.Success)
{
    Console.WriteLine($"Full match: {match.Value}");
    Console.WriteLine($"Group 1: {match.Groups[1].Value}");
    Console.WriteLine($"Group 2: {match.Groups[2].Value}");
    Console.WriteLine($"Group 안녕하세요: {match.Groups["안녕하세요"].Value}");
}

이 예제는 전화번호 형식과 같은 패턴을 매칭하고, 이를 세 그룹으로 나누어 캡처하는 방법을 보여줍니다.

Full match: 123-45-6789
Group 1: 123
Group 2: 45
Group 안녕하세요: 6789

4. 정규 표현식 옵션: 다양한 옵션을 통한 제어

정규 표현식에서 다양한 옵션을 사용해 패턴 매칭을 더 유연하게 만들 수 있어요.

4.1 RegexOptions 사용법

정규 표현식에서 자주 사용하는 옵션을 통해 패턴 매칭을 조정할 수 있습니다.

  • RegexOptions.IgnoreCase: 대소문자 구분 없음
  • RegexOptions.Multiline: 여러 줄에서 각각의 줄 시작과 끝을 인식

예시

string pattern = @"abc";
string input = "ABC";

Match match = Regex.Match(input, pattern, RegexOptions.IgnoreCase);
Console.WriteLine(match.Success);  // true

이 예제에서는 RegexOptions.IgnoreCase를 사용해 대소문자 구분을 무시하고 패턴을 매칭하는 방법을 다룹니다.

5. 고급 패턴 매칭 및 실무 적용

실제로 사용할 수 있는 정규 표현식 패턴을 작성하고, 복잡한 텍스트 매칭을 통해 실무에 적용해보겠습니다.

5.1 이메일 주소 매칭

이메일 주소를 확인하는 정규 표현식은 실무에서 자주 사용됩니다. 이를 통해 간단한 유효성 검사를 할 수 있습니다.

예시

string pattern = @"\w+@\w+\.\w{2,3}";
string input = "test@example.com";

Match match = Regex.Match(input, pattern);
Console.WriteLine(match.Success);  // true

5.2 URL 매칭

URL 검증 역시 실무에서 자주 사용되는 패턴입니다. 이 패턴을 통해 웹 주소를 확인할 수 있습니다.

5.3 기타 응용 예시

  • 전화번호 매칭: (123) 456-7890 형식의 전화번호 찾기
  • 날짜 매칭: MM/DD/YYYY 형식의 날짜 찾기
이전최근
댓글 쓰기
가져가실 때, 출처 표시 부탁드려요! 감사합니다. 💗