당신들이 이 방면에 대해 토론하는 것을 보고, 이번 판에 대한 사심없는 헌신을 보여주기 위해 약간의 공헌을 합니다. 아이고:
사용자가 Linux 에서 sed, awk, grep 또는 VI 를 잘 알고 있다면 정규식의 개념은 그들에게 친숙할 것이다. 문자열을 처리하는 복잡성을 크게 단순화할 수 있기 때문이다
도, 그래서 지금은 많은 Linux 유틸리티에 적용되었습니다. 정규식은 Perl, Python, Bash 등의 스크립팅 언어에 대한 특허일 뿐이라고 생각해서는 안 됩니다. , c 언어 프로그램으로.
멤버, 사용자는 자신의 프로그램에서 정규 표현식을 사용할 수도 있습니다.
표준 C 및 C++ 는 정규 표현식을 지원하지 않지만 C/C++ 프로그래머가 이 기능을 수행할 수 있도록 지원하는 라이브러리가 있습니다. 가장 유명한 것은 Philip Hazel 의 Perl 호환 정규식 라이브러리로, 많은 Linux 릴리스에 포함되어 있습니다.
정규식을 컴파일합니다
효율성을 높이기 위해 문자열을 일반 표현식으로 비교하기 전에 regcomp () 함수를 사용하여 컴파일하고 regex_t 구조로 변환해야 합니다.
Int regcomp(regex_t *preg, const char *regex, int cflags);
Regex 인수는 컴파일할 정규식을 나타내는 문자열입니다. Preg 매개 변수는 컴파일 결과를 저장하기 위해 regex_t 로 선언된 데이터 구조를 가리킵니다. Cflags 매개 변수는 일반 표현식의 세부 사항을 처리하는 방법을 결정합니다.
함수 regcomp () 가 성공적으로 실행되고 컴파일 결과가 preg 에 제대로 채워진 경우 함수는 0 을 반환하고 다른 모든 반환 결과는 오류를 나타냅니다.
정규식과 일치
Regcomp () 함수가 일반 표현식을 성공적으로 컴파일한 후에는 regexec () 함수를 호출하여 패턴 일치를 완료할 수 있습니다.
Int regexec(const regex_t *preg, const char *string, size_t nmatch, regmatch_t pmatch[], iii
Typedef 구조 {
Regoff _ t RM _ so
Regoff _ t RM _ EO
} regmatch _ t;;
Preg 매개 변수는 컴파일된 정규식을 가리키고, string 매개 변수는 일치시킬 문자열이며, nmatch 및 pmatch 매개 변수는 호출자에게 일치 결과를 반환하는 데 사용되고, 마지막 매개 변수인 eflags 는 일치 세부 정보를 결정합니다.
함수 regexec () 를 호출하여 패턴을 일치시키는 동안 문자열에 지정된 정규식에 여러 번 일치하는 항목이 있을 수 있으며 pmatch 매개 변수를 사용하여 보장합니다.
이러한 일치 위치를 저장합니다. nmatch 매개 변수는 regexec () 함수에 pmatch 배열에 채울 수 있는 최대 일치 결과 수를 알려줍니다. Regexec () 함수가 성공적으로 반환되면
Back, from string+pmatch[0]. Rm_so 에서 string+pmatch[0] 까지. Rm_eo 는 일치하는 첫 번째 문자열이며
String+pmatch[ 1]. Rm_so 에서 string+pmatch[ 1] 까지. Rm_eo 는 두 번째로 일치하는 문자열입니다.
정규 표현식 해제
컴파일된 정규식이 더 이상 필요하지 않을 때마다 regfree () 함수를 호출하여 메모리 누수를 방지해야 합니다.
Void regfree (regex _ t * preg);
Regfree () 함수는 결과를 반환하지 않습니다. Regex_t 데이터 유형에 대한 포인터만 받습니다. 이 포인터는 이전에 regcomp () 함수를 호출한 컴파일 결과입니다.
프로그램에서 동일한 regex_t 구조에 대해 regcomp () 함수를 여러 번 호출하는 경우 POSIX 표준에서는 매번 regfree () 함수를 호출해야 하는지 여부를 지정하지 않습니다.
그러나 regcomp () 함수를 호출하여 일반 표현식을 컴파일할 때마다 regfree () 함수를 호출하여 사용 중인 저장 공간을 최대한 빨리 확보하는 것이 좋습니다.
오류 메시지 보고
함수 regcomp () 또는 regexec () 를 호출하여 0 이 아닌 반환 값을 얻으면 일반 표현식을 처리하는 동안 오류가 발생한 것이므로 함수 regerror () 를 호출하여 자세한 오류 정보를 얻을 수 있습니다.
Size_t regerror(int errcode, const regex_t *preg, char *errbuf, size _ t errbuf _ size);
매개 변수 errcode 는 함수 regcomp () 또는 regexec () 의 오류 코드이고 매개 변수 preg 는 함수 regcomp () 의 컴파일 결과입니다.
그 목적은 regerror () 함수에 메시지 형식을 지정하는 데 필요한 컨텍스트를 제공하는 것입니다. 함수 regerror () 를 실행할 때 errbuf_size 매개 변수가 나타내는 최대 문자 수를 따릅니다.
세그먼트 번호, errbuf 버퍼에 형식화된 오류 메시지를 채우고 오류 메시지의 길이를 반환합니다.
정규식을 적용합니다
마지막으로 구체적인 예를 통해 C 언어 프로그램에서 정규 표현식을 처리하는 방법을 설명합니다.
# include & ltstdio.h & gt;;
# include & ltsys/types.h > 을 눌러 섹션을 인쇄할 수도 있습니다
# include & ltregex.h & gt;;
/* 하위 문자열을 허용하는 함수 */
정적 char* substr(const char*str, 부호 없는 시작, 부호 없는 끝)
{
부호 없는 n = 종료-시작;
정적 char ST buf [256];
Strncpy(stbuf, str+start, n);
Stbuf [n] = 0;
Stbuf 를 반환합니다
}
/* 마스터 프로그램 */
Int main(int argc, char** argv)
{
Char * 모드
Int x, z, lno = 0, cflags = 0;;
Char ebuf[ 128], lbuf [256];
Regex _ t reg
Regmatch _ t pm [10];
Constsize _ t nmatch =10;
/* 정규 표현식 컴파일 */
패턴 = argv [1];
Z = regcomp(& amp;; Reg, pattern, cflags) :
만약 (z! = 0){
Regerror(z & amp;; Reg, ebuf, sizeof(ebuf)););
Fprintf(stderr, "%s: pattern '%s' \n", ebuf, pattern);
1;
}
/* 입력 데이터를 한 줄씩 처리 */
While(fgets(lbuf, sizeof(lbuf), stdin)) {
++lno;
If ((z = strlen (lbuf)) > 을 눌러 섹션을 인쇄할 수도 있습니다 0&& lbuf [z-1] = = =' \ n''
Lbuf [z-1] = 0;
/* 각 행에 정규식을 적용하여 일치 */
Z = regexec(& amp;; Reg, lbuf, nmatch, pm, 0);
If (z == REG_NOMATCH) 계속;
Else if (z! = 0) {
Regerror(z & amp;; Reg, ebuf, sizeof(ebuf)););
Fprintf(stderr, "%s: regcom('%s')\n", ebuf, lbuf);
Return 2;;
}
/* 출력 처리 결과 */
For(x = 0;; X< 가 일치하지 않습니다. & amppm[x] 입니다. Rm_so! =-1; ++ x) {
만약 (! X) printf("%04d: %s\n ",lno, lbuf);
Printf(" $%d='%s'\n ",x, substr(lbuf, pm[x]). Rm_so, pm[x] 입니다. RM _ EO)););
}
}
/* 정규 표현식 해제 */
Regfree(& amp;; 레그);
0 을 반환합니다
}
위 프로그램은 명령줄에서 정규 표현식을 가져와 표준 입력에서 가져온 각 데이터 행에 적용하고 일치 결과를 인쇄합니다. 다음 명령을 실행하여 프로그램을 컴파일하고 실행합니다.
# gcc 정규식. c -o 정규식
#./regexp' regex [a-z] *' < 정규 표현식 c
0003:# include & lt;; Regex.h & gt;;
$0='regex' 입니다
0027:regex _ t reg;;
$0='regex' 입니다
0054: z = regexec (& Reg, lbuf, nmatch, pm, 0);
$0='regexec' 입니다
요약
정규 표현식은 복잡한 데이터 처리가 필요한 프로그램에 매우 유용한 도구입니다. 이 문서에서는 C 언어에서 정규 표현식을 사용하여 문자열 처리를 단순화하여 데이터 처리에서 Perl 언어와 유사한 유연성을 얻는 방법에 대해 중점적으로 설명합니다.