티스토리 뷰

반응형

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]
반응형
250x250
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/04   »
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
글 보관함