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(®ex, pattern, REG_EXTENDED);
if (ret) {
printf("정규표현식 컴파일 실패\\n");
return 1;
}
ret = regexec(®ex, string, 0, NULL, 0);
if (!ret) {
printf("일치하는 문자열입니다.\\n");
} else {
printf("일치하지 않는 문자열입니다.\\n");
}
regfree(®ex);
return 0;
}
출력 결과:
일치하는 문자열입니다.
4. 실전 활용 예제
4.1. 숫자만 포함된 문자열 검사
#include <stdio.h>
#include <regex.h>
void check_numeric(const char *str) {
regex_t regex;
regcomp(®ex, "^[0-9]+$", REG_EXTENDED);
if (regexec(®ex, str, 0, NULL, 0) == 0) {
printf("%s: 숫자만 포함된 문자열입니다.\\n", str);
} else {
printf("%s: 숫자가 아닌 문자가 포함되어 있습니다.\\n", str);
}
regfree(®ex);
}
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(®ex, pattern, REG_EXTENDED);
if (regexec(®ex, 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(®ex);
return 0;
}
출력 결과:
문자열: 이름
숫자: 1234
6. regex.h 사용 시 주의할 점
- 정규표현식 복잡성: 복잡한 패턴은 성능 저하를 유발할 수 있으므로 필요할 때만 사용하세요.
- 메모리 관리: regfree() 함수를 사용하여 메모리 누수를 방지하세요.
- 에러 처리: regerror() 함수를 사용하여 오류 메시지를 출력할 수 있습니다.
7. 결론
C 언어에서 regex.h를 사용한 정규표현식 처리는 문자열 분석과 패턴 검증에 유용합니다. 이메일 검증, 입력 유효성 검사, 데이터 추출 등 다양한 작업에 활용할 수 있습니다. 올바른 사용법과 주의사항을 숙지하여 안전하고 효율적인 코드를 작성해 보세요.
'Standard C' 카테고리의 다른 글
C 언어 main 함수 작성법 완벽 가이드 (0) | 2025.04.20 |
---|---|
C 언어 snprintf 사용법 완벽 가이드 (0) | 2025.02.22 |
C 언어 scanf 사용법 완벽 가이드 (0) | 2025.02.22 |
C 언어 fgetc 사용법 완벽 가이드 (0) | 2025.02.22 |
C 언어 fflush 사용법 완벽 가이드 (0) | 2025.02.22 |