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
'기타[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 |