이것저것

regex.h 사용법

ForceCore 2010. 7. 6. 17:31
#include <stdio.h>
#include <regex.h>
#include <assert.h>

int main()
{
    #define MAX_NUM 10
    int stat;
    regex_t fsm;
    regmatch_t nm[MAX_NUM];
    assert( 0 == regcomp( &fsm, "load[ \t]*:[ \t]*\\(.\\+\\)", REG_ICASE ) );

    stat = regexec( &fsm, "aaa load :  30", MAX_NUM, nm, 0 );
    printf( "%d %d %d\n", stat, nm[1].rm_so, nm[1].rm_eo );
    return 0;
}

POSIX 정규표현식을 써서 원하는 부분 뽑아내는 방뻡.

1. 정규표현식을 "regcomp"함수를 이용하여 "컴파일"하여 FSM으로 만든 다음에(이론적으로 컴파일이지만 뭔지모르겠으면 초기화와 비슷하게, 무조건 컴파일 해야된다고 알아두면 된다.)

2. regexec를 이용하여 FSM을 실행시킨다. 즉, 주어진 string을 정규표현식에 match시켜본다.

3. regexec함수의 결과는 0. (match성공시)

4. perl 정규표현식하고 좀 쓰는 사투리가 달라서 애먹긴 함. perl로 치면  $1 $2로 변수를 저장시키는 괄호는 \\(, \\)를 사용해야지 된다.

5. 역시 또 주의할 것은 *는 그냥 잘 인식하는데, +는 \+로 써야지 perl의 +로 인식된다(one or more 표현).

6. 괄호때문에 저장되는 variable은... perl에서는 variable로 저장되지만 C에는 그런게 어딨나. 좀처럼 쉽지 않으니까, 위 예제처럼 regmatch_t 의 array를 사용한다.
위 예제에서는 nm[1].rm_so, nm[1].rm_eo 변수가 포인트.
perl로 치면 $1을 사용할 때는 nm 배열의 1번 index에 접근하는데... 원래 string의 괄호로 match된 substring의 시작과 끝 index가 각각 rm_so, rm_eo다. regexp match start offset, regexp match end offset의 약자인듯.