C 언어 정규 표현 식 상세 설명 regcomp()regexec()regfree()용법 상세 설명

표준 C 와 C++는 정규 표현 식 을 지원 하지 않 지만 일부 함수 라 이브 러 리 는 C/C+프로그래머 를 보조 하여 이 기능 을 완성 할 수 있 습 니 다.그 중에서 가장 유명한 것 은 Philip Hazel 의 Perl-Compatible Regular Expression 라 이브 러 리 입 니 다.많은 Linux 발행 버 전 은 이 함수 라 이브 러 리 를 가지 고 있 습 니 다.
C 언어 처리 정규 표현 식 에서 자주 사용 하 는 함 수 는 regcomp(),regexec(),regfree()와 regerror()가 있 는데 보통 세 단계 로 나 뉘 는데 다음 과 같다.
C 언어 에서 정규 표현 식 을 사용 하 는 것 은 보통 세 단계 로 나 뉜 다.
  • 정규 표현 식 regcomp()컴 파일
  • 정규 표현 식 regexec()
  • 와 일치 합 니 다.
  • 정규 표현 식 regfree()
  • 방출
    다음은 세 함수 에 대한 상세 한 설명 이다.
    1、int regcomp (regex_t *compiled, const char *pattern, int cflags)
    이 함 수 는 지정 한 정규 표현 식 pattern 을 특정한 데이터 형식 copiled 로 컴 파일 하여 매 칭 을 더욱 효과적으로 할 수 있 습 니 다.함수 regexec 는 이 데 이 터 를 사용 하여 대상 텍스트 문자열 에서 패턴 을 일치 시 킵 니 다.실행 성공 반환 0. 
    매개 변수 설명:
    ①regex_t 는 컴 파일 된 정규 표현 식 을 저장 하 는 구조 체 데이터 형식 입 니 다.구성원 rensub 는 정규 표현 식 의 하위 정규 표현 식 의 개 수 를 저장 하 는 데 사용 되 며,하위 정규 표현 식 은 괄호 로 싸 인 부분 표현 식 입 니 다.
    ② pattern 은 우리 가 쓴 정규 표현 식 을 가리 키 는 지침 입 니 다.
    ③ cflags 는 다음 과 같은 4 개의 값 이나 연산(|)후의 값 이 있 습 니 다.
    REG_EXTENDED 는 기능 이 더 강 한 확장 정규 표현 식 으로 일치 합 니 다.
    REG_ICASE 가 알파벳 과 일치 할 때 대소 문 자 를 무시 합 니 다.
    REG_NOSUB 는 일치 하 는 결 과 를 저장 하지 않 습 니 다.
    REG_NEWLINE 은 줄 바 꿈 자 를 인식 합 니 다.그러면'$'는 줄 끝 부터 일치 할 수 있 고'^'는 줄 의 시작 부터 일치 할 수 있 습 니 다.
    2. int regexec (regex_t *compiled, char *string, size_t nmatch, regmatch_t matchptr [], int eflags)
    정규 표현 식 을 컴 파일 한 후에 regexec 로 대상 텍스트 문자열 에 일치 할 수 있 습 니 다.정규 표현 식 을 컴 파일 할 때 cflags 의 인 자 를 REG 로 지정 하지 않 았 다 면NEWLINE 은 기본적으로 줄 바 꿈 자 를 무시 합 니 다.즉,전체 텍스트 문자열 을 문자열 로 처리 합 니 다.실행 성공 반환 0.
    regmatch_t 는 구조 체 데이터 형식 으로 regex.h 에서 정의 합 니 다.
    typedef struct
    {
    regoff_t rm_so;
    regoff_t rm_eo;
    } regmatch_t;
    멤버 rmso 대상 문자열 의 시작 위치 에 일치 하 는 텍스트 문자열 을 저장 합 니 다.rmeo 저장 끝 위치.일반적으로 우 리 는 배열 의 형식 으로 이러한 구 조 를 정의 한다.우리 의 정규 표현 식 에는 하위 정규 표현 식 도 포함 되 어 있 기 때문이다.배열 0 단원 은 주 정규 표현 식 위 치 를 저장 하고 뒤쪽 단원 은 하위 정규 표현 식 위 치 를 순서대로 저장 합 니 다.
    매개 변수 설명:
    ① copiled 는 regcomp 함수 로 컴 파일 된 정규 표현 식 입 니 다.
    ② string 은 대상 텍스트 문자열 입 니 다.
    ③ nmatch 는 regmatcht 구조 체 배열 의 길이.
    ④matchptr regmatch_t 형식의 구조 체 배열 로 텍스트 문자열 과 일치 하 는 위치 정 보 를 저장 합 니 다.
    ⑤ eflags 는 두 가지 값 이 있다.
    REG_NOTBOL 은 이 값 을 지정 하면'^'는 우리 의 목표 문자열 부터 일치 하지 않 는 다 는 것 을 이해 합 니 다.어쨌든 나 는 아직 까지 이 매개 변수의 의 미 를 잘 모른다.
    REG_NOTEOL 과 위의 그 역할 은 차이 가 많 지 않 지만,이 지정 은 end of line 을 끝 냅 니 다.
    3. void regfree (regex_t *compiled)
    컴 파일 된 정규 표현 식 을 사용 하거나 다른 정규 표현 식 을 다시 컴 파일 하려 면 이 함수 로 copiled 가 가리 키 는 regex 를 비 울 수 있 습 니 다.t 구조 체 의 내용 을 기억 하 세 요.재 컴 파일 이 라면 regex 를 비 워 야 합 니 다.t 구조 체.
    4. size_t regerror (int errcode, regex_t *compiled, char *buffer, size_t length)
    regcomp 나 regexec 를 실행 하 는 중 오류 가 발생 했 을 때 이 함 수 를 호출 하여 오류 정 보 를 포함 하 는 문자열 을 되 돌려 줍 니 다.
    매개 변수 설명:
    ① errcode 는 regcomp 와 regexec 함수 에서 돌아 오 는 오류 코드 입 니 다.
    ② copiled 는 regcomp 함수 로 컴 파일 된 정규 표현 식 으로 이 값 은 NULL 이 될 수 있 습 니 다.
    ③ buffer 는 잘못된 정 보 를 저장 하 는 문자열 의 메모리 공간 을 가리킨다.
    ④ length 는 buffer 의 길 이 를 가리 키 며,이 오류 정보의 길이 가 이 값 보다 크 면 regerror 함수 가 초과 한 문자열 을 자동 으로 차단 하지만,그 는 여전히 완전한 문자열 의 길 이 를 되 돌려 줍 니 다.그래서 우 리 는 다음 과 같은 방법 으로 잘못된 문자열 의 길 이 를 먼저 얻 을 수 있다.
    size_t length = regerror (errcode, compiled, NULL, 0);
    아래 는 이메일 과 일치 하 는 예 입 니 다.위의 세 단계 만 따 르 면 됩 니 다.

    다음 프로그램 은 명령 행 에서 정규 표현 식 을 가 져 온 다음 표준 입력 에서 얻 은 줄 마다 데 이 터 를 전송 하고 일치 하 는 결 과 를 출력 합 니 다.
    
    #include <stdio.h>
    #include <sys/types.h>
    #include <regex.h>
    
    /*        */
    static char* substr(const char*str,
    unsigned start, unsigned end)
    {
     unsigned n = end - start;
     static char stbuf[256];
     strncpy(stbuf, str + start, n);
     stbuf[n] = 0;
     return stbuf;
    }
    
    /*     */
    int main(int argc, char** argv)
    {
     char * pattern;
     int x, z, lno = 0, cflags = 0;
     char ebuf[128], lbuf[256];
     regex_t reg;
     regmatch_t pm[10];
     const size_t nmatch = 10;
     /*        */
     pattern = argv[1];
     z = regcomp(?, pattern, cflags);
     if (z != 0){
      regerror(z, ?, ebuf, sizeof(ebuf));
      fprintf(stderr, "%s: pattern '%s' 
    ",ebuf, pattern); return 1; } /* */ while(fgets(lbuf, sizeof(lbuf), stdin)) { ++lno; if ((z = strlen(lbuf)) > 0 && lbuf[z-1] == '
    ') lbuf[z - 1] = 0; /* */ z = regexec(?, lbuf, nmatch, pm, 0); if (z == REG_NOMATCH) continue; else if (z != 0) { regerror(z, ?, ebuf, sizeof(ebuf)); fprintf(stderr, "%s: regcom('%s')
    ", ebuf, lbuf); return 2; } /* */ for (x = 0; x < nmatch && pm[x].rm_so != -1; ++ x) { if (!x) printf("%04d: %s
    ", lno, lbuf); printf(" $%d='%s'
    ", x, substr(lbuf, pm[x].rm_so, pm[x].rm_eo)); } } /* */ regfree(?); return 0; }
    다음 명령 을 실행 하면 프로그램 을 컴 파일 하고 실행 할 수 있 습 니 다.
    
    # gcc regexp.c -o regexp
    # ./regexp 'regex[a-z]*' < regexp.c
    0003: #include <regex.h>
    $0='regex'
    0027: regex_t reg;
    $0='regex'
    0054: z = regexec(?, lbuf, nmatch, pm, 0);
    $0='regexec'
    소결:복잡 한 데이터 처리 가 필요 한 프로그램 에 있어 정규 표현 식 은 매우 유용 한 도구 임 에 틀림없다.본 고 는 C 언어 에서 정규 표현 식 을 이용 하여 문자열 처 리 를 간소화 하여 데이터 처리 에 있어 Perl 언어 와 유사 한 유연성 을 얻 을 수 있 도록 하 는 데 중심 을 두 고 있다.

    좋은 웹페이지 즐겨찾기