REGEX(3)

명칭
regcomp, regexec, regerror, regfree - 정규 표현 프로그램 라이브러리

서식
#include <sys/types.h>
#include <regex.h>

int regcomp(regex_t *preg, const char *pattern, 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);

해설
이 routine는, POSIX 1003.2 정규 표현(``RE'')을 실현하고 있습니다. (을)를 참조해 주세요. regcomp (은)는, 내부 폼에 string로서 기입해진 RE 를 컴파일 합니다. regexec (은)는, 그 내부 폼을 string와 맞대어 결과를 보고합니다. regerror (은)는, 에러 코드를 사람이 판독할 수 있는 메세지로 변환합니다. regfree (은)는, RE 의 내부 폼으로 사용되는, 다이나믹하게 할당해진 기억역을 해방합니다.

헤더 <regex.h> (은)는, 컴파일 된 내부 폼용의 regex_t, 및 맞대고의 보고용의 regmatch_t 그렇다고 하는, 2 개의 구조체 타입을 선언합니다. 4 개의 함수, 타입 regoff_t, 이름이 ``REG_''로 시작되는 정수의 수도 선언합니다.

Regcomp (은)는, cflags 의 플래그에 따라, pattern string에 포함되는 정규 표현을 컴파일 해, preg 하지만 가리킨다 regex_t 구조체에 결과를 배치합니다. cflags (은)는, 제로개이상의 이하의 플래그로 비트 WAIS 논리합을 취한 것입니다.

REG_EXTENDED
    디폴트의 낡은 ( ``기본'' ) RE 대신에, 새로운 ( ``확장'' ) RE 를 컴파일 합니다.

REG_BASIC
    0 의 동의어입니다. REG_EXTENDED 에 대해서 제공된 것으로, 읽기 쉬움을 개선합니다.

REG_NOSPEC
    모든 특수 캐릭터가 무효가 되어 있는 것을 인식해 컴파일 합니다. 모든 캐릭터는 통상 캐릭터로 간주해지므로, ``RE''는 리터럴 string가 됩니다. 이것은, POSIX 1003.2 로 호환성이 있지만 지정되어 있지 않은 extension입니다. 다른 시스템에 이식하는 것을 목적으로 한 소프트웨어에서는 주의해 사용해 주세요. REG_EXTENDED 와 REG_NOSPEC 는, regcomp 의 호출로 동시에는 사용할 수 없습니다.

REG_ICASE
    대문자와 소문자를 구별하지 않는 매칭용으로 컴파일 합니다. (을)를 참조해 주세요.

REG_NOSUB
    일치한 것이 아니고, 문제의 유무의 리포트만이 필요한 매칭용으로 컴파일 합니다.

REG_NEWLINE
    개행을 고려하는 매칭용으로 컴파일 합니다. 디폴트의 경우, 개행은, RE 와 string로 특수한 의미가 없는, 완전한 통상 캐릭터입니다. 이 플래그를 사용하면(자), 블랭킷 `[^'와 `. '는 개행과 일치하지 않게 됩니다. 닻 `^'는, 통상 함수에 가세해 string의 개행의 뒤에 있는 NULL string와 일치하게 됩니다. 닻 `$'는, 통상 함수에 가세해 string의 개행 전에 있는 NULL string와 일치하게 됩니다.

REG_PEND
    최초의 NULL 가 아니고, preg 하지만 가리키는 구조체의 re_endp 멤버가 가리키는 캐릭터의 직전에 정규 표현이 끝나게 됩니다. re_endp 멤버의 타입은 const char * 입니다. 이 플래그는, RE 에 NULL 가 포함되는 것을 허가합니다. 이 NULL 는, 통상 캐릭터로 간주해집니다. 이것은, POSIX 1003.2 로 호환성이 있지만 지정되어 있지 않은 extension입니다. 다른 시스템에의 이식을 목적으로 한 소프트웨어에서는 주의해 사용해 주세요.

문제가 없는 경우, regcomp (은)는 0 을 되돌려, preg 하지만 가리키는 구조체에 데이터를 넣습니다. 이 구조체의 1 개의 멤버 ( re_endp 이외 )는 공표됩니다. size_t 타입의 re_nsub 에는, RE 의 괄호로 둘러싸인 서브 표현의 수가 들어갑니다 ( REG_NOSUB 플래그를 사용했을 경우, 이 멤버의 값은 부정이 됩니다 ) . regcomp 그리고 에러가 발생하면(자), 제로 이외의 에러 코드가 되돌려집니다. 진단을 참조해 주세요.

regexec (은)는, eflags 의 플래그에 따라, preg 하지만 가리키는 컴파일이 끝난 RE 를 string (와)과 맞대어 nmatch, pmatch, 반환값을 사용해 결과를 보고합니다. RE 는, 이것 이전에 regcomp (을)를 호출해 컴파일 해 둘 필요가 있습니다. 컴파일 된 폼은, regexec (을)를 실행해도 변경되지 않기 때문에, 1 개의 컴파일이 끝난 RE 를 복수의 thread로 동시에 사용할 수 있습니다.

디폴트의 경우, string 하지만 가리키는, NULL 로 종료하는 string는, 라인 전체로부터 마지막 개행을 제외한 텍스트로 간주해집니다. eflags 인수는, 제로개이상의 이하의 플래그로 비트 WAIS 논리합을 취한 것입니다.

REG_NOTBOL
    string의 최초의 캐릭터가 라인의 최초로는 없기 때문에,`^'닻이 그 전으로 일치할 필요는 없습니다. REG_NEWLINE 의 개행의 동작은 영향을 받지 않습니다.

REG_NOTEOL
    string를 종료하는 NULL 가 라인을 종료하지 않기 때문에,`$'닻이 그 전으로 일치할 필요는 없습니다. REG_NEWLINE 의 개행의 동작은 영향을 받지 않습니다.

REG_STARTEND
    nmatch 의 값에 관계없이, string가 string + pmatch[0].rm_so 그리고 시작되어, 마지막 NULL 가 string + pmatch[0].rm_eo 에 배치되고 있는 (그 자리소에 NULL 가 실제로 존재할 필요는 없다 )와 보입니다. pmatch (와)과 nmatch 의 정의에 대해서는, 아래와 같이를 참조해 주세요. 이것은, POSIX 1003.2 로 호환성이 있지만 지정되어 있지 않은 extension입니다. 다른 시스템에의 이식을 목적으로 한 소프트웨어에서는 주의해 사용해 주세요. rm_so가 제로 이외에서 만나도, REG_NOTBOL 가 암시될 것은 없습니다. REG_STARTEND 는 string의 위치에만 영향을 주어, 매칭 방법에는 영향을 주지 않습니다.

RE 과소의 일부가 string 의 substring와 일치하는 상황으로 일치하는 것에 대해서는, (을)를 참조해 주세요.

통상의 경우, regexec (은)는 문제가 없으면 0 을 되돌려, 문제가 있으면(자) 제로 이외의 코드 REG_NOMATCH 를 되돌립니다. 예외적인 상황에서는, 제로는 아닌, 이외의 에러 코드가 되돌려지는 일이 있습니다. 진단을 참조해 주세요.

RE 의 컴파일로 REG_NOSUB 를 지정했을 경우, 또는 nmatch 하지만 0 인 경우, regexec 하 pmatch 인수를 무시합니다 ( REG_STARTEND 를 지정했을 경우에 대해서는 아래와 같이 참조 ) . 그 외의 경우, pmatch 하 regmatch_t 타입의 nmatch 구조체의 배열을 가리킵니다. 이러한 구조체에는, substring의 제 1 캐릭터의 오프셋(offset)를 포함한다 rm_so , 및 substring의 마지막 뒤에 있는 제 1 캐릭터의 오프셋(offset)를 포함한다 rm_eo 그렇다고 하는 멤버가 최악이지도 필요합니다. 어느쪽이나 타입은 regoff_t (최악이어도 사이즈가 off_t (와)과 ssize_t 인, 부호 첨부 산술 타입 )입니다. 오프셋(offset)는, regexec (으)로 지정했다 string 인수의 최초부터 계측 됩니다. 하늘의 substring는, 하늘의 substring에 계속된다 캐릭터를 나타내는, 동일한 오프셋(offset)로 표현됩니다.

pmatch 배열의 0 번째의 멤버에는, RE 전체로 일치한, string 의 substring가 들어갑니다. 나머지의 멤버는, RE 의 괄호로 둘러싸인 서브 표현으로 일치한 substring를 보고합니다. 멤버 i (은)는, RE 의 왼쪽 괄호의 차수를 왼쪽에서 오른쪽으로 1 으로부터 센 서브 표현으로, 서브 표현 i (을)를 보고합니다. 맞대어에 전혀 관계하지 않았던 서브 표현이나 RE 에 존재하지 않는다 서브 표현 (즉, i > preg->re_nsub)에 대응하는, 배열의 미사용 엔트리에서는, rm_so (와)과 rm_eo 의 양쪽 모두가 -1 로 설정되어 있습니다. 서브 표현이 맞대어에 여러 차례 관계했을 경우는, 일치한 마지막 substring가 보고됩니다 ( RE `(b*)+'가 `bbb'와 일치하는 경우, 괄호에 둘러싸인 서브 표현은, 3 개(살) 각각의 `b' , 및 마지막 `b'에 계속되는 무한의 하늘 string와 일치하기 위해(때문에), 보고되는 substring는 하늘 중 1 개가 됩니다 ) .

REG_STARTEND 를 지정했을 경우, pmatch (은)는 최악이어도 1 개(살)의 regmatch_t (을)를 가리켜 ( nmatch 하지만 0 인지, REG_NOSUB 를 지정했을 경우에서도 ), REG_STARTEND 의 입력 오프셋(offset)를 보관 유지할 필요가 있습니다. 출력에서의 사용은, nmatch 그리고 완전하게 제어됩니다. nmatch 하지만 0 인 경우, 또는 REG_NOSUB 를 지정했을 경우, pmatch[0] 의 값은, regexec 그리고 문제가 발생하지 않으면 변경되지 않습니다.

regerror (은)는, regcomp 인가 regexec 의 제로가 아니다 errcode (을)를 인간이 판독 가능해 출력할 수 있는 메세지에 MAP 합니다. preg 하지만 NULL 이외인 경우, 에러 코드는, preg 하지만 가리킨다 regex_t 의 사용으로부터 발생합니다. 에러 코드가 regcomp (으)로부터의 것인 경우, 에러 코드는, 그 regex_t (을)를 사용해 최근 실행했다 regcomp 의 결과가 됩니다 (regerror (은)는, regex_t 의 정보를 사용해보다 상세한 메세지를 제공하는 일이 있습니다 ) . regerror (은)는, NULL 로 끝나는 메세지를 errbuf 하지만 가리키는 버퍼에 배치합니다. NULL 를 포함한 메세지의 길이는, 최대로 errbuf_size 바이트에 제한됩니다. 메세지 전체가 들어가지 않는 경우는, 마지막 NULL 의 전으로 들어가는 부분까지가 제공됩니다. 어떠한 경우에서도, 반환값은, 마지막 NULL 도 포함한, 메세지 전체를 보관 유지하는데 필요한 버퍼 사이즈가 됩니다. errbuf_size 하지만 0 인 경우, errbuf (은)는 무시됩니다만, 반환값은 정확합니다.

regerror 에게 줄 수 있었다 errcode (와)과 REG_ITOA 의 논리합을 최초로 취하면(자), 작성되는 ``메세지''는, 에러 코드의 설명이 아닌 구, ``REG_NOMATCH'' 등, 에러 코드의 출력 가능한 이름이 됩니다. errcode 하지만 REG_ATOI 인 경우, preg (은)는 NULL 이외로, 이것이 가리키는 구조체의 re_endp 멤버는, 에러 코드의 출력 가능한 이름을 가리킬 필요가 있습니다. 이 경우, errbuf 의 결과는, 에러 코드의 수치의 십진수가 됩니다 (이름이 인식되지 않는 경우는 0 ) . REG_ITOA 와 REG_ATOI 는, 주로 디버그를 목적으로 한 것입니다. 이것은, POSIX 1003.2 로 호환성이 있지만 지정되어 있지 않다 extension입니다. 다른 시스템에의 이식을 목적으로 한 소프트웨어에서는 주의해 사용해 주세요. 또 시험적인 물건으로 간주해지고 있으므로, 변경되는 일이 있게도 주의해 주세요.

regfree (은)는, preg 하지만 가리키는 컴파일이 끝난 RE 에 관련하는, 다이나믹하게 할당해진 기억역을 해방합니다. 남았다 regex_t (은)는 유효한 컴파일이 끝난 RE 는 아니기 때문에, regexec 인가 regerror 그리고 이것을 사용해도 결과는 부정이 됩니다.

이 모든 함수는, 목차를 제외한 글로벌 변수를 참조하지 않습니다. 인수가 안전한 경우, 복수의 thread로 사용해도 안전합니다.

실장에 있어서의 선택
1003.2 에는,``미정도리''라고 명언하는 형태로, 또는 RE 의 문법으로 금지되고 있다고 하는 형태로, 시스템 설계자에게 맡기고 있는 미결정사항이 많이 있습니다. 이 시스템에서는, 이 미결정사항을 이하와 같이 취급하고 있습니다.

대문자와 소문자를 구별하는 매칭의 정의에 대해서는, (을)를 참조해 주세요.

메모리의 제한을 제외하면, RE 의 길이에 제한은 없습니다. 메모리의 사용량은 RE 의 사이즈에 대체로 비례하고 있어, 제한부의 반복을 제외해, RE 의 복잡함에 크게 좌우될 것은 없습니다. 대부분의 시스템으로 메모리가 부족하는, 반복을 사용한 짧은 RE 에 대해서는, 버그를 참조해 주세요.

1003.2 로 특별한 의미 (이러한 특별한 의미는, 낡은 [``basic''] RE 에만 있습니다 )가 주어지고 있는 것 이외의 backslash 캐릭터는, 통상 캐릭터로 간주해집니다.

일치하지 않는 [ 은 REG_EBRACK 에러입니다.

등가 클래스는, 괄호로 둘러싸인 표현의 범위를 시작하거나 종료하거나 할 수 없습니다. 어느 범위의 종료점이, 다른 범위의 개시점이 될 것은 없습니다.

제한부 반복의 반복수의 제한인 RE_DUP_MAX 는 255 입니다.

반복 연산자 (?, *, +, 제한)에 다른 반복 연산자를 계속할 수 없습니다. 반복 연산자로 표현이나 서브 표현을 시작하거나 `^'인가 `|'의 후에 반복 연산자를 계속하거나 할 수 없습니다.

표현이나 서브 표현의 최초인가 마지막에 `|'를 사용하거나`|'의 후에 다른 `|'를 사용하거나 할 수 없습니다. 예를 들어,`|'의 오퍼랜드를 하늘의 서브 표현으로 할 수 없습니다. 괄호로 둘러싸인 하늘의 서브 표현 `()'는 허가되고 있어 하늘의 string나 substring와 일치합니다. 하늘의 string (은)는, 적절한 RE 가 아닙니다.

후에 숫자가 계속되는 `{'는, 제한부 반복의 제한의 시작으로 간주해집니다. 이 경우는, 제한의 문장구조법에 따를 필요가 있습니다. 후에 숫자가 계속되지 않는 `{'는, 통상 캐릭터로 간주해집니다.

낡은 ( ``기본'' ) RE 의 서브 표현의 개시와 종료를 나타내는 `^'와 `$'는 닻 (이어)여, 통상 캐릭터가 아닙니다.

관련 항목
grep(1), re_format(7) POSIX 1003.2, sections 2.8 (Regular Expression Notation) 및 B. 5 (C Binding for Regular Expression Matching)

진단
이하는, regcomp (와)과 regexec 의 제로가 아닌 에러 코드입니다.

REG_NOMATCH	regexec()의 일치로 에러가 발생
REG_BADPAT	정규 표현이 올바르지 않다
REG_ECOLLATE	조합하는 엘리먼트가 올바르지 않다
REG_ECTYPE	캐릭터 클래스가 올바르지 않다
REG_EESCAPE	이스케이프 이외의 캐릭터에 \ 가 붙어 있다
REG_ESUBREG	백 레퍼런스 번호가 올바르지 않다
REG_EBRACK	괄호 [ ] 의 수가 맞지 않는다
REG_EPAREN	괄호 ( )의 수가 맞지 않는다
REG_EBRACE	괄호 { } 의 수가 맞지 않는다
REG_BADBR	{ } 의 반복수가 올바르지 않다
REG_ERANGE      [ ] 의 캐릭터 범위가 올바르지 않다
REG_ESPACE	메모리 부족
REG_BADRPT      ?, *, + 오퍼랜드가 올바르지 않다
REG_EMPTY	하늘의 표현이나 서브 표현
REG_ASSERT	``있을 수 없는'', 즉 버그
REG_INVARG	인수가 올바르지 않다 (부의 길이의 string 등 )

역사
최초의 저자는 Henry Spencer 입니다. 의 배포에 포함하기 위해서(때문에) 변경되었습니다.

버그
알파 릴리스이기 (위해)때문에, 결함이 있는 것이 알려져 있습니다. 문제가 있는 경우는 보고해 주세요.

기능적인 버그로서 알려져 있는 것에, 국제화의 시스템이 불완전하다라고 말하는 일이 있습니다. 1003.2 의 디폴트 로케일이 항상 가정되므로, 그 로케일의 조합 엘리먼트등 밖에 사용할 수 없습니다.

백 레퍼런스 코드는 미묘해, 복잡한 경우는 그 정확함에 의문이 남습니다.

regexec 의 퍼포먼스는 낮아지고 있습니다. 후의 릴리스에서는 개선됩니다만, nmatch 하지만 0 을 넘으면(자) 코스트가 들어, 1 을 넘으면(자) 상황은 한층 더 악화됩니다. regexec (은)는, 백 레퍼런스에 많은 코스트가 드는 경우를 제외해, RE 의 복잡함에는 크게 영향을 받지 않습니다. 문제는 RE 의 길이로, 특수 캐릭터를 2 배로서 계산해, RE 의 길이를 약 30 캐릭터에 거두면(자), 처리는 빨라집니다.

regcomp (은)는, 매크로 확장으로 제한부 반복을 실현하고 있습니다. 제한부 반복에는, 수가 큰 경우, 또는 제한부 반복이 네스트 되고 있는 경우, 길다 시간으로 많은 스페이스가 필요합니다. 예를 들어 `((((a{1,100}){1,100}){1,100}){1,100}){1,100}' (와)과 같은 RE 에서는, 최종적으로 대부분의 머신으로 스왑 스페이스가 부족합니다.

분명히 하지 않는 에러 조건에의 반응에도 문제가 있는 것 같습니다. 매우 큰 RE 인가 복잡하게 네스트 한 제한부 반복으로 일으켜지는, 특정의 내부 오버플로우는, 적절히 처리되지 않는 것이 있습니다.

1003.2 의 잘못에 의해, 일치하지 않는 `('가 전에 있는 경우에게만 `)'가 특수 캐릭터가 되므로, `a) b'와 같은 것이 올바른 RE 가 되어 버립니다. 이 문제는, 사양이 수정될 때까지 수정되지 않습니다.

백 레퍼런스에 관한, 표준의 정의는 애매하게 되어 있습니다. 예를 들어 `a\(\(b\) *\2\) *d'가 `abbbd'와 일치해 버립니다. 표준이 명확하게 될 때까지, 이러한 경우의 동작은 신뢰해야 하지는 않습니다.

워드 경계 매칭의 시스템은 다소 애매해, 워드 경계 매칭 (와)과 닻의 편성에는 버그가 잠복하고 있을 가능성이 있습니다.