C 언어 정규 표현 식 상세 설명 regcomp()regexec()regfree()용법 상세 설명
C 언어 처리 정규 표현 식 에서 자주 사용 하 는 함 수 는 regcomp(),regexec(),regfree()와 regerror()가 있 는데 보통 세 단계 로 나 뉘 는데 다음 과 같다.
C 언어 에서 정규 표현 식 을 사용 하 는 것 은 보통 세 단계 로 나 뉜 다.
다음은 세 함수 에 대한 상세 한 설명 이다.
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 언어 와 유사 한 유연성 을 얻 을 수 있 도록 하 는 데 중심 을 두 고 있다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
C 언어 체인 시계는 뱀을 탐식하는 작은 게임을 실현한다본고의 실례는 여러분에게 C 언어 체인표가 뱀 탐식 게임을 실현하는 구체적인 코드를 공유하여 참고하도록 하였으며, 구체적인 내용은 다음과 같다. 프로젝트 이름: 뱀놀이 운영 환경: Linux 프로그래밍 언어: C 언...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.