Regex (정규표현식)

김민수·2025년 1월 8일

C++

목록 보기
7/68

정규 표현식(Regular Expression, Regex)은 특정 패턴을 가진 문자열을 찾거나 수정하는 데 사용되는 도구다. <regex> 헤더를 사용해서 정규 표현식을 다룰 수 있다. 문자열 검색, 데이터 검증, 텍스트 치환 등의 작업에 유용하게 사용된다.


⦁ 주요 클래스

클래스설명
std::regex정규 표현식을 정의하는 클래스
std::smatch문자열 매칭 결과를 저장하는 클래스
std::regex_match전체 문자열이 정규 표현식과 일치하는지 확인
std::regex_search문자열 내에서 정규 표현식과 일치하는 부분을 검색
std::regex_replace정규 표현식에 일치하는 부분을 다른 문자열로 치환

⦁ 사용 예시

#include <regex>

int main() {
    std::string text = "이메일: example@test.com, 전화번호: 010-1234-5678";

    // 이메일 패턴
    std::regex email_pattern(R"([a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,})");
    std::smatch email_match;

    // regex_search: 텍스트에서 정규 표현식에 맞는 부분 검색
    if (std::regex_search(text, email_match, email_pattern)) {
        std::cout << "추출된 이메일: " << email_match[0] << std::endl;
    }

    // 전화번호 패턴
    std::regex phone_pattern(R"(01[0-9]-\d{3,4}-\d{4})");
    std::smatch phone_match;

    if (std::regex_search(text, phone_match, phone_pattern)) {
        std::cout << "추출된 전화번호: " << phone_match[0] << std::endl;
    }

    return 0;
}

⦁ 정규 표현식 패턴

패턴설명예시
[abc]a, b, c 중 하나와 일치[aeiou] → 모든 모음
[a-z]소문자 알파벳과 일치[a-zA-Z] → 모든 알파벳
\d숫자와 일치 ([0-9]와 동일)\d{3} → 3자리 숫자
\w알파벳, 숫자, 밑줄(_) 문자와 일치\w+ → 단어와 일치
\s공백 문자(스페이스, 탭, 줄바꿈 등)와 일치\s+ → 공백 하나 이상과 일치
^문자열 시작^Hello → "Hello"로 시작하는 문자열
$문자열 끝end$ → "end"로 끝나는 문자열
.임의의 한 문자와 일치a.c → "abc", "a9c"
*0개 이상의 반복fo* → "f", "fo", "foo"
+1개 이상의 반복fo+ → "fo", "foo"
?0개 또는 1개의 반복colou?r → "color", "colour"
``OR 조건
()그룹(abc)+ → "abc", "abcabc"


1. std::regex_replace

문자열에서 정규 표현식에 일치하는 부분을 찾아 다른 문자열로 치환하는 함수다. 특정 패턴을 찾아 원하는 형식으로 바꿀 때 사용된다.


⦁ 함수 시그니처

std::string regex_replace(const std::string& input, 
                          const std::regex& pattern, 
                          const std::string& replacement, 
                          std::regex_constants::match_flag_type flags = std::regex_constants::match_default);
  • input: 대상 문자열
  • pattern: 치환할 패턴(정규 표현식)
  • replacement: 일치한 부분을 대체할 문자열
  • flags: 치환 방식에 영향을 미치는 플래그 (선택 사항)

⦁ 플래그 옵션

플래그설명
std::regex_constants::match_default기본 동작으로, 모든 패턴을 찾아 치환
std::regex_constants::format_no_copy일치하지 않는 부분은 복사하지 않음
std::regex_constants::format_first_only첫 번째 일치 항목만 치환하고 나머지는 유지

⦁ 예시

#include <regex>

int main() {
    std::string text = "오늘 날씨는 좋다. 날씨가 정말 좋다.";
    std::regex pattern("날씨");
    std::string replaced_text = std::regex_replace(text, pattern, "기분");

    std::cout << "치환된 문자열: " << replaced_text << std::endl;
    return 0;
}

출력 결과

치환된 문자열: 오늘 기분은 좋다. 기분가 정말 좋다.


2. std::regex_match

문자열이 정규 표현식과 완전히 일치하는지 확인하는 함수다. 문자열 전체가 주어진 정규 표현식과 일치해야 true를 반환한다.


⦁ 함수 시그니처

bool regex_match(const std::string& input, 
                 std::smatch& result, 
                 const std::regex& pattern, 
                 std::regex_constants::match_flag_type flags = std::regex_constants::match_default);
                 
bool regex_match(const std::string& input, 
                 const std::regex& pattern, 
                 std::regex_constants::match_flag_type flags = std::regex_constants::match_default);
  • input: 일치 여부를 검사할 문자열
  • result: 일치한 부분의 정보를 저장할 객체(std::smatch)
  • pattern: 비교할 정규 표현식
  • flags: 일치 방식에 영향을 주는 플래그 (선택 사항)

⦁ 플래그 옵션

플래그설명
std::regex_constants::match_default기본 동작으로, 전체 문자열이 정규 표현식과 완전히 일치해야 true
std::regex_constants::match_not_bol문자열의 시작을 무시 (^ 앵커 무시)
std::regex_constants::match_not_eol문자열의 끝을 무시 ($ 앵커 무시)

⦁ 예시

#include <regex>

int main() {
    std::string text = "hello";
    std::regex pattern(R"([a-z]+)");

    if (std::regex_match(text, pattern)) {
        std::cout << "문자열이 정규 표현식과 완전히 일치합니다." << std::endl;
    } else {
        std::cout << "문자열이 정규 표현식과 일치하지 않습니다." << std::endl;
    }

    return 0;
}

출력 결과:

문자열이 정규 표현식과 완전히 일치합니다.


문자열 내에 정규 표현식과 일치하는 부분이 존재하는지 검사하는 함수다. std::regex_match와 달리 부분 일치를 허용하며, 일치하는 모든 부분을 찾을 수 있다.


⦁ 함수 시그니처

bool regex_search(const std::string& input, 
                  std::smatch& result, 
                  const std::regex& pattern, 
                  std::regex_constants::match_flag_type flags = std::regex_constants::match_default);

bool regex_search(const std::string& input, 
                  const std::regex& pattern, 
                  std::regex_constants::match_flag_type flags = std::regex_constants::match_default);
  • input: 검사할 문자열
  • result: 일치한 부분의 정보를 저장할 객체(std::smatch)
  • pattern: 비교할 정규 표현식
  • flags: 일치 방식에 영향을 주는 플래그 (선택 사항)

⦁ 플래그 옵션

플래그설명
std::regex_constants::match_default기본 동작으로, 문자열에서 정규 표현식과 일치하는 첫 번째 부분을 찾음
std::regex_constants::match_not_bol문자열의 시작(^ 앵커)을 무시하고 검색
std::regex_constants::match_not_eol문자열의 끝($ 앵커)을 무시하고 검색

⦁ 예시

#include <regex>

int main() {
    std::string text = "The quick brown fox jumps over the lazy dog";
    std::regex pattern(R"(quick)");

    if (std::regex_search(text, pattern)) {
        std::cout << "문자열에 'quick'이 포함되어 있습니다." << std::endl;
    } else {
        std::cout << "문자열에 'quick'이 포함되어 있지 않습니다." << std::endl;
    }

    return 0;
}
  • 출력 결과:
문자열에 'quick'이 포함되어 있습니다.

std::regex_search는 정규 표현식과 일치하는 부분이 문자열 내에 존재하는지만 확인하며, 부분 일치만으로도 true를 반환한다.

profile
안녕하세요

0개의 댓글