Standard C

C 언어 정규표현식 사용법 완벽 가이드

레퍼러 2025. 2. 22. 22:02

C 언어에서 정규표현식(Regular Expression, regex)은 문자열에서 특정 패턴을 검색하거나 검증하는 데 사용됩니다. C 표준 라이브러리에는 정규표현식을 직접 지원하는 함수는 없지만, POSIX 표준의 <regex.h> 라이브러리를 통해 구현할 수 있습니다.


1. 정규표현식 기본 개념

정규표현식은 문자열에서 특정 패턴을 찾기 위한 도구입니다. 예를 들어, 이메일 주소 형식 검사, 특정 키워드 검색 등에 사용됩니다.

주요 기호 및 의미:

  • . : 임의의 한 문자
  • * : 앞의 문자가 0번 이상 반복
  • + : 앞의 문자가 1번 이상 반복
  • ? : 앞의 문자가 0번 또는 1번 등장
  • ^ : 문자열의 시작
  • $ : 문자열의 끝
  • [abc] : a, b 또는 c 중 하나
  • [^abc] : a, b, c 이외의 문자
  • \\ : 특수 문자 이스케이프

2. C 언어에서 regex.h 사용법

C 언어에서는 <regex.h> 헤더 파일을 사용하여 정규표현식을 처리할 수 있습니다. 주요 함수는 다음과 같습니다:

  • regcomp(): 정규표현식 컴파일
  • regexec(): 문자열에서 정규표현식 검색
  • regfree(): 정규표현식에 사용된 메모리 해제

3. 기본 사용 예제

#include <stdio.h>
#include <regex.h>

int main() {
    regex_t regex;
    int ret;

    const char *pattern = "^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\\\.[A-Za-z]{2,}$";
    const char *string = "example@example.com";

    ret = regcomp(&regex, pattern, REG_EXTENDED);
    if (ret) {
        printf("정규표현식 컴파일 실패\\n");
        return 1;
    }

    ret = regexec(&regex, string, 0, NULL, 0);
    if (!ret) {
        printf("일치하는 문자열입니다.\\n");
    } else {
        printf("일치하지 않는 문자열입니다.\\n");
    }

    regfree(&regex);
    return 0;
}

출력 결과:

일치하는 문자열입니다.

4. 실전 활용 예제

4.1. 숫자만 포함된 문자열 검사

#include <stdio.h>
#include <regex.h>

void check_numeric(const char *str) {
    regex_t regex;
    regcomp(&regex, "^[0-9]+$", REG_EXTENDED);
    if (regexec(&regex, str, 0, NULL, 0) == 0) {
        printf("%s: 숫자만 포함된 문자열입니다.\\n", str);
    } else {
        printf("%s: 숫자가 아닌 문자가 포함되어 있습니다.\\n", str);
    }
    regfree(&regex);
}

int main() {
    check_numeric("12345");
    check_numeric("123abc");
    return 0;
}

출력 결과:

12345: 숫자만 포함된 문자열입니다.
123abc: 숫자가 아닌 문자가 포함되어 있습니다.

5. regexec에서 캡처 그룹 사용

정규표현식에서 괄호 ()는 캡처 그룹을 의미하며, 일치하는 하위 문자열을 추출할 수 있습니다.

#include <stdio.h>
#include <regex.h>

int main() {
    regex_t regex;
    regmatch_t matches[2];
    const char *pattern = "([a-zA-Z]+) ([0-9]+)";
    const char *str = "이름 1234";

    regcomp(&regex, pattern, REG_EXTENDED);
    if (regexec(&regex, str, 2, matches, 0) == 0) {
        printf("문자열: %.*s\\n", (int)(matches[1].rm_eo - matches[1].rm_so), str + matches[1].rm_so);
        printf("숫자: %.*s\\n", (int)(matches[2].rm_eo - matches[2].rm_so), str + matches[2].rm_so);
    } else {
        printf("일치하는 패턴이 없습니다.\\n");
    }

    regfree(&regex);
    return 0;
}

출력 결과:

문자열: 이름
숫자: 1234

6. regex.h 사용 시 주의할 점

  1. 정규표현식 복잡성: 복잡한 패턴은 성능 저하를 유발할 수 있으므로 필요할 때만 사용하세요.
  2. 메모리 관리: regfree() 함수를 사용하여 메모리 누수를 방지하세요.
  3. 에러 처리: regerror() 함수를 사용하여 오류 메시지를 출력할 수 있습니다.

7. 결론

C 언어에서 regex.h를 사용한 정규표현식 처리는 문자열 분석과 패턴 검증에 유용합니다. 이메일 검증, 입력 유효성 검사, 데이터 추출 등 다양한 작업에 활용할 수 있습니다. 올바른 사용법과 주의사항을 숙지하여 안전하고 효율적인 코드를 작성해 보세요.