티스토리 뷰
반응형
c++에서는 regex를 사용하여 정규화된 문자열을 구분 할수가 있지만
C 에서는 다르게 사용 해야 한다.
c에서는 regcomp() 와 regexec(), regfree() 사용하여 처리 해야 한다.
예제 설명
다음 아래의 예시를 통해 어떻게 문자열에 대한 정규식을 처리 하는지 설명 한다.
char *pattern = "^[\\*]+([A-Za-z0-9]{1,})+([\\*]{1})+([A-Za-z0-9]{1,})+(|[\\-]{1})+(|[0-9]{2})";
예시의 문자열 Format은 *1234*56789-2 형태이다. 모두 숫자로만 표기 되었지만 pattern 알파벳을 포함 하여
처리 하도록 되어 있다.
- ^[\\*] 은 무조건 시작은 * 되어 함을 의미 한다.
- ([A-Za-z0-9]{1,}) 에서 () 서브정규식을 의미 한다. 즉 정규식이 하나가 아니라 () 갯수 만큼 존재 한다 라는 의미 이다.
예를 들어 010-1234 라고 했을때 (010)-(1234) 정규식으로 구성 하면 1234라는 문자열이 존재하지 않을수 있다라는
의미가 된다. 즉 010- 이렇게 되었을때 처리 이다.
[A-Za-z0-9] 은 알파벳 대문자 A-Z , 소문자 a-z, 숫자 0-9 까지만 사용될수 있음을 의미 한다.
{1,} 은 최소 1개이상의 문자열 이어야 함을 의미 한다. {, 1} 이라고 하면 최대 1개의 문자만을 의미 한다. - |[\\-]{1} 에서 | 은 OR을 의미 한다. 즉 없을수도 있다는 의미 이다. \\- 은 문자 -을 의미 하고
{1} 은 1개의 문자를 의미 한다. - |[0-9]{2} 은 | 은 OR을 의미 한다. 즉 없을수도 있다는 의미 이다. [0-9] 는 숫자만을 의미 하고
{2} 무조건 2글자 이어야 함을 의미 한다.
예제 소스
#include <stdio.h>
#include <stdlib.h>
#include <regex.h>
#include <string.h>
int regrex_to_parser(char *text1, char *p1, char *p2, int *p3 )
{
int ret = 0;
regex_t preg;
size_t nmatch = 6;
regmatch_t rmatch[6];
char type_str[3] = {0,};
char *pattern = "^[\\*]+([A-Za-z0-9]{1,})+([\\*]{1})+([A-Za-z0-9]{1,})+(|[\\-]{1})+(|[0-9]{2})";
if (0 != (ret = regcomp(&preg, pattern, REG_EXTENDED)))
{
printf("debug1\n");
return -1;
}
if (0 != (ret = regexec(&preg, text1, nmatch, rmatch, 0)))
return -1;
else
{
//p1
if(rmatch[1].rm_eo - rmatch[1].rm_so>0)
memcpy(p1, text1+rmatch[1].rm_so, rmatch[1].rm_eo - rmatch[1].rm_so);
//p2
if(rmatch[3].rm_eo - rmatch[3].rm_so>0)
memcpy(p2, text1+rmatch[3].rm_so, rmatch[3].rm_eo - rmatch[3].rm_so);
//p3
if(rmatch[5].rm_eo - rmatch[5].rm_so>0)
{
memcpy(type_str, text1+rmatch[5].rm_so, rmatch[5].rm_eo - rmatch[5].rm_so);
*p3 = atoi(type_str);
}
else p3 = 0;
}
regfree(&preg);
return 0;
}
int main() {
char *test = "*111*1234-05";
char cust_id[20] = {0, };
char ref_ext[20] = {0, };
int type;
int ret = regrex_to_parser(test, cust_id, ref_ext, &type);
printf("fmc_ext : %s\n", test);
printf("cust_id : %s\n", cust_id);
printf("ref_ext : %s\n", ref_ext);
printf("type : %d\n", type);
printf("ret : %d\n", ret);
return 0;
}
fmc_ext : *111*1234-05
cust_id : 111
ref_ext : 1234
type : 5
ret : 0
[Execution complete with exit code 0]
반응형
'개발자 이야기 > Unix C & C++' 카테고리의 다른 글
Linux c++ filesystem 컴파일 에러 발생 해결 ( compile error ) (0) | 2025.03.06 |
---|---|
[ C++17 ] function 과 람다 혼합 하여 output 전달 기법 (0) | 2025.03.04 |
libssh 빌드 ( 컴파일 ) 방법 (0) | 2025.02.19 |
OpenSource Linux Crontab Source (0) | 2025.01.03 |
gSOAP Linux86-64에서 컴파일 하기 (0) | 2018.10.07 |
VirtualBox Frame Buffer 환경 (0) | 2018.02.05 |
dns named mrtg (0) | 2017.02.15 |
UNIX TCP/IP NonBlocing Connection (0) | 2012.05.15 |
250x250
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 베란다
- 커널
- 커피컵
- 사무실
- 큐비보드
- 벌교
- 식물
- 여행
- 버추얼박스
- Android
- 1회용
- 채소 키우기
- CubieBoard2
- C
- 고흥
- 수경재배
- Linux
- 리눅스
- GCC
- C++
- cross compile
- arm
- 크로스컴파일
- 식물키우기
- 식물 키우기
- embeded
- 1회용컵
- kernel
- 임베이디드
- 상추
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
글 보관함