본문 바로가기

기타[etc]

C언어 정규식

SMALL

C언어에서 정규식 사용


헤더

#include "sys/types.h"

#include "regex.h"


관련 함수

       int regcomp(regex_t *preg, const char *regex, int cflags);

       int regexec(const regex_t *preg, const char *string, size_t nmatch, regmatch_t pmatch[], int eflags);

       size_t regerror(int errcode, const regex_t *preg, char *errbuf, size_t errbuf_size);

       void regfree(regex_t *preg);





 int regcomp(regex_t *preg, const char *regex, int cflags)

regexec() 함수에서 사용가능한 형식으로 패턴을 컴파일 해준다.

preg 포인터의 경우 컴파일된 regular 형식의 저장소를 가지고 있다. 간단하게 말하면 저 포인터에

정규식 매칭하는 값들이 저장되어 있다.

즉 regcomp 정규식 컴파일 하면, 입력 값으로 넣었던 preg 포인터에 정규식이 저장되는 것이다.


int regexec(const regex_t *preg, const char *string, size_t nmatch, regmatch_t pmatch[], int eflags)

커파일된 정규식 형식을 가지고 주어진 문자열에서 정규식에 해당하는 값을 찾는다.


그리고 관련 flag 값들이다.

       REG_EXTENDED

              Use POSIX Extended Regular Expression syntax when interpreting regex.  If not set, POSIX Basic Regular Expression syntax is used.


       REG_ICASE

              Do not differentiate case.  Subsequent regexec() searches using this pattern buffer will be case insensitive.


       REG_NOSUB

              Do not report position of matches.  The nmatch and pmatch arguments to regexec() are ignored if the pattern buffer supplied was 

              compiled with this flag set.


       REG_NEWLINE

            Match-any-character operators don't match a newline. A nonmatching list ([^...])  not containing a newline does not match a newline.    

            Match-beginning-of-line operator (^) matches the empty string immediately after a newline, regardless of whether eflags, 

            the execution lags of regexec(), contains REG_NOTBOL.

            Match-end-of-line operator ($) matches the empty string immediately before a newline, regardless of whether eflags contains NOTEOL.


예제코드)

int main(int argc, char *argv[])
{
  regex_t state;
  const char *urls[] = {
    "https://www.naver.com/",
    "sasdfsf",
    "httpa://www.naver.com/asdf"
  };
  const char *pattern = "^(file|gopher|news|nntp|telnet|https?|ftps?|sftp):\/\/([a-z0-9-]+\.)+[a-z0-9]{2,4}.*$";

  int index;
  //compile
  regcomp(&state, pattern, REG_EXTENDED);

  for (index = 0; index < 3; index++) {
    //check
    int status = regexec(&state, urls[index], 0, NULL, 0);
    if(status==0)
        printf("match : %s\n", urls[index]);
    else
        printf("unmatch : %s\n", urls[index]);
  }

  return 0;
}

결과 값

richong@ubuntu:~$ ./reg 

match : https://www.naver.com/

unmatch : sasdfsf

unmatch : httpa://www.naver.com/asdf



LIST

'기타[etc]' 카테고리의 다른 글

[C언어] Serial 통신 프로그램  (0) 2017.05.22
so[dll] Makefile Template  (0) 2017.05.19
python idle 컬러 수정  (0) 2017.03.30
Mips 환경 구축  (0) 2017.03.29
Makefile  (0) 2017.03.27