블로그는 나의 힘!
[ Programing ]/Server2010. 6. 29. 22:21
  입력 처리해야 하는 텍스트들이 단순하고 변형이 없는 데이터면 직접 해당 버퍼에 접근해 입력 처리 하는것도 나쁘지 않으나, 데이터가 복잡해 질 경우 정규 표현식으로 처리 하는 것이 좋은 방법.
텍스트 처리 목적으로 정규 표현식을 사용할 경우에 정규 표현식만 변경하면 여러 다른 종류의 데이터를 처리할 수 있으므로 정규 표현식을 사용하는 방법을 알아두자.


// 정규 표현식 패턴 문자열을 패턴 버퍼로 컴파일한다. ( 공간 확보 )
int regcomp( regex_t *preg, const char *regex, int cflags );

*preg   : 사용자가 지정한 *regex를 컴퓨터가 인식하는 패턴 버퍼로 컴파일
*regex : 사용자가 지정한 패턴
cflags  : 어떤 방식의 정규 표현식 패턴으로 인식할 것인지 지정
반환값 : 제대로 패턴 버퍼가 컴파일 되었다면 0 리턴, 실패시 REG_BADRPT, REG_BADBR, REG_EBRACE, REG_EBRACK,
            REG_RANGE, REG_ECTYPE, REG_COLLATE, REG_EPAREN, REG_ESUBREG, REG_EEND, REG_ESCAPE,
            REG_BADPAT, REG_SIZE, REG_SPACE 리턴

cflags 속성
REG_EXTENDED : POSIX 확장 정규 표현식 문법을 적용한다.
                           이것을 적용하지 않을 시 POSIX 기본 정규 표현식 문법이 적용된다.
REG_ICASE        : 대소문자 구분을 무시한다.
REG_NOSUB       : 서브스트링을 무시한다. ()로 묶여져서 패턴 매칭된 부분만을 떼어서 보고하는 작업을 하지 않는다.
REG_NEWLINE    : .이나  ···, ^··· 등의 요소들이 new line과는 매칭하지 않는다.




// 컴파일된 패턴 버퍼를 검색할 문자열에 적용한다.
int regexec( const regex_t *preg, const char *string, size_t nmatch, regmatch_t pmatch[], int eflag );

*preg                   : regcomp()에서 컴파일된 패턴 버퍼를 넣는다.
*string                  : 검사할 문자열
nmatch, pmatch[] : 순서대로 서브스트링을 이용한 백레퍼런스 매칭 테이블 배열 개수와 매칭 테이블
eflag                    : 매칭시킬 규칙의 옵션 플래그
반환값                  : 매칭 성공시 0 리턴, 실패시 REGNOMATCH 리턴
※ 매칭이 성공적으로 되었을 때 백레퍼런스나 서브스트링을 위해 사용한다면 regmatch_t 구조체의 매칭 테이블에 매칭된 문자열의 시작과 끝의 오프셋을 기록해 주게 되어 있다.  이 구조체는 2개의 오프셋만 가진다.
    typedef struct
   {
         regoff_t rm_so;     // 매칭이 성공한 문자열의 시작 오프셋
         regoff_t rm_eo;     // 매칭이 끝나는 곳의 오프셋
    } regmatch_t;

cflags 속성
REG_NOTBOL
 : [not beginning of line] 라인의 시작 패턴인 ^를 사용하지 못한다.
REG_NOTEOL : [not end of line] 라인의 마지막 패턴인 $를 사용하지 못한다.


// 패턴 버퍼에 할당된 메모리를 해제 한다.
void regfree( regex_t *preg );

*preg : 더 이상 패턴 버퍼를 사용하지 않는다면 할당된 메모리를 해제 시켜 준다.
           해제되지 않는다면 다른 패턴을 컴파일시 에러 발생





// 에러 발생시 에러를 보고 한다.
size_t regerror( int errcode, const regex_t *preg, char *errbuf, size_t errbuf_size );

regcomp가 컴파일 실패시 반환한 값으로 자세한 정보 볼 수 있다.

ex)
if( ( ret = regcomp( &expr, regex, REG_EXTENDED | REG_NEWLINE ) ) )
{
     regerror( ret, &expr, errorBuffer, sizeof( errorBuffer ) );
     exit( 1 );
}
출저 : Advanced 리눅스 시스템 네트워크 프로그래밍 (가메출판사) 내용 중

'[ Programing ] > Server' 카테고리의 다른 글

이벤트 객체 CreateEvent, SetEvent, ResetEvent, PulseEvent  (0) 2012.12.04
Shared memory  (0) 2010.07.23
메모리 락  (0) 2010.06.29
Mutex 설정  (0) 2010.06.16
Deadlock  (0) 2010.06.16
Posted by Mister_Q