REGEXP(3)

명칭
regcomp, regexec, regsub, regerror - 정규 표현 핸들러

프로그램 라이브러리
libcompat

서식
<regexp.h> regexp * regcomp(const char *exp) int regexec(const regexp *prog, const char *string) void regsub(const regexp *prog, const char *source, char *dest)

해설
이 인터페이스는, regex(3) 그리고 옮겨놓을 수 있었습니다.

regcomp(), regexec(), regsub(), regerror() 하 egrep(1) 스타일의 정규 표현과 서포트 기능을 실현하고 있습니다.

regcomp() (은)는, 정규 표현을 regexp() 타입의 구조체에 컴파일 해, 그 구조체의 포인터를 되돌립니다. 스페이스 하 malloc(3) 그리고 할당해져 free 그리고 해방됩니다.

regexec() 함수는, NULL 그리고 끝난다 string (을)를 prog 의 컴파일이 끝난 정규 표현과 맞댑니다. 문제가 없는 경우는 1을 되돌려, 문 제목이 있는 경우는 0을 되돌립니다. 또, prog 의 startp (와)과 endp (아래와 같은 참조)의 내용을 조정합니다.

regexp() 구조체의 멤버에게는, 최악이어도 이하가 필요합니다. 차례는 관계 없습니다.

    char *startp[NSUBEXP];
    char *endp[NSUBEXP];

NSUBEXP (은)는, 헤더 파일로 10에 정의되고 있습니다. regexp() (을)를 사용해 regexec() 하지만 문제 없게 실행되면(자), startp (와)과 endp 의 각 페어는, string 의 substring를 나타냅니다. startp (은)는 substring의 제 1 캐릭터를 가리켜, endp (은)는 substring의 다음의 제 1 캐릭터를 가리킵니다. 0번째의 substring (은)는, 정규 표현 전체와 일치한다 string 의 substring입니다. 그 외는, 정규 표현의 괄호로 둘러싸인 표현과 일치한다 substring입니다. 괄호로 둘러싸인 표현에는, 왼쪽 괄호의 왼쪽에서 오른쪽의 차수로 차례 호가 붙습니다.

regsub() 함수는, prog (을)를 사용해 마지막에 실행했다 regexec() 에 따라 치환을 행하면서, source (을)를 dest 에 카피합니다. source 의 `&'의 각 인스턴스는, startp[] (와)과 endp[] 그리고 나타나는 substring로 옮겨놓을 수 있습니다. ‘\n’ 의 각 인스턴스(n는 숫자)는, startp[n] (와)과 endp[n] 그리고 나타나는 substring로 옮겨놓을 수 있습니다. 리터럴 `&'나 ‘\n’ (을)를 dest 에 배치하려면 , 그 리터럴의 전에 `\'를 배치합니다. `&'나 ‘\n’ 의 전에 리터럴 `\'를 붙이려면 , 그 전에 `\'를 이제(벌써) 1개붙입니다.

regerror() 함수는, regcomp(), regexec(), regsub() 그리고 에러가 검출되면(자) 항상 불려 갑니다. 디폴트의 regerror() (은)는, 원인의 적절한 인디케이터(indicator)를 사용해, string msg (을)를 표준 에러 출력에 기입해 exit(3) (을)를 호출합니다. 그 외의 액션이 바람직한 경우, 유저는 regerror() 함수를 다른 것과 옮겨놓을 수 있습니다.

정규 표현 문장구조법
정규 표현은,`|'로 단락지어진, 0이상의 브랜치(branch)입니다. 브랜치(branch)의 하나로 일치하는 것과 일치합니다.

브랜치(branch)는, 0이상의 연결한 부분입니다. 최초로 일치한 것과 일치했다 다음에, 다음에 일치한 것과 일치합니다.

부분은,`*' , `+' , `? '가 계속되는 일이 있는 아톰입니다. `*'가 계속되는 아톰은, 아톰의 0이상의 일치의 순차 순서와 일치합니다. `+'가 계속되는 아톰은, 아톰의 1이상의 일치의 순차 순서와 일치합니다. `? '가 계속되는 아톰은, 아톰의 일치, 또는 null string와 일치합니다.

아톰은, 괄호로 둘러싸인 정규 표현(정규 표현의 일치와 일치한다), 범위(아래와 같이 참조),`. ' ( 1 캐릭터와 일치한다),`^' (입력 string의 최초의 null string와 일치한다),`$' (입력 string의 마지막 null string와 1 치 한다), 1 캐릭터가 계속되는 `\' (그 캐릭터와 일치한다), 그 외의 의미가 없는 1 캐릭터(그 캐릭터와 일치한다)입니다.

범위는,`[]'로 둘러싸인 캐릭터의 순차 순서입니다. 통상은, 그 시케 스의 1 캐릭터와 일치합니다. 순차 순서가 `^'로 시작되는 경우는, 시 켄스의 나머지의 캐릭터가 아닌 1 캐릭터와 일치합니다. 순차 순서의 2개의 캐릭터가 `-'로 단락지어지고 있는 경우, 이것은, 그 2 캐릭터 에 끼워졌다 ASCII 캐릭터의 리스트를 나타냅니다(예를 들어 `[0-9]'는, 임의의 십진수로 일치해 ). 순차 순서에 리터럴 `]'를 짜넣으려면 , 그것을 최초의 캐릭터 (으)로 합니다( `^'가 있는 경우는 그 다음의 캐릭터로 합니다). 리터럴 `-' (을)를 짜넣으려면 , 최초인가 마지막 캐릭터로 합니다.

애매성
정규 표현이 입력 string의 2개의 부분과 일치하는 경우는, 최초의 것과 일치 합니다. 양쪽 모두가 같은 장소에서 시작되어 있지만 길이가 다른 경우, 또는 길이가 같아 다른 장소에서 시작되어 있는 경우, 현실은 이하와 같이 복잡하게 됩니다.

일반적으로, 브랜치(branch)의 리스트의 실현성은 왼쪽에서 오른쪽으로 고려됩니다. `*', `+', `? '의 실현성은 긴 것으로부터 고려됩니다. 네스트 된 콘스트라크트는 밖 옆으로부터 고려됩니다. 연결된 콘스트라크트는 왼쪽으로부터 고려됩니다. 선 택 되는 일치는, 최초의 선택사항의 최초의 실현성을 사용하는 것이 됩니다. 선택사항이 다수 있는 경우는, 최초의 결정에 따라, 다음이 같은 방법(최초의 실현성) 그리고 행해집니다. 나머지도 똑같이 됩니다.

예를 들어 ‘(ab|a) b*c’ 하지만 `abc'와 일치하는 방법에는 2개 있습니다. 최초의 선택사항은, `ab'와 `a' 의 사이입니다. `ab'가 앞으로, 문제 없는 일치 전체를 리드하므로, 이것이 선택함 그)와 일치합니다. 앞의 선택사항을 고려할 필요가 있기 때문입니다.

`|'가 존재하지 않고,`*' , `+', `? '가 1개만 존재하는 경우는, 가장 긴 일치 하지만 선택되는 결과가 됩니다. `xabbbby'로 제공된 `ab*'는, `abbbb' (와)과 일치합니다. `ab*'가 `xabyabbbz'로 시험 받으면(자), 최초의 것이 선택되고 의 것으로, `x'의 후의 `ab'와 일치하는 것에 주의해 주세요. (실제로는, 일치를 시작하는 장소의 결정이 최초의 선택사항이므로, 후의 선택사항에서는, 우선 순위가 낮은 대안이 리드하고 있어도 그것을 고려할 필요가 있습니다. )

반환값
regcomp() 함수는, 문장구조법 에러, 시스템 제한의 초월, NULL 오퍼랜드에의 `+'나 `*'의 적용등의 에러가 발생했을 경우는 NULL (을)를 되돌립니다( regerror() 하지만 개시됩니다).

관련 항목
ed(1), egrep(1), ex(1), expr(1), fgrep(1), grep(1), regex(3)

역사
regcomp(), regexec(), regsub(), regerror() 의 코드와 메뉴얼 페이지는, 토론토 대학에서 작성되어 4.3-TahoeBSD 에 추가되었습니다. Bell V8 regexp(3) (와)과 호환성을 유지하게 되어 있습니다만, Bell 코드로부터 파생한 것에서는 선.

버그
하늘의 브랜치(branch)와 하늘의 정규 표현은, V8 와 호환성은 없습니다.

NULL 오퍼랜드에 `*'인가 `+'를 적용하는 것에 부과되는 제한은, 시스템을 단 순수하게하기 위한의 것입니다.

egrep 의 개행으로 단락지어진 브랜치(branch)는 서포트되고 있지 않습니다. V8 regexp(3) 그렇지만 서포트되고 있지 않습니다.

간결함과 단순함을 강조했기 때문에, 그만큼 빠르지는 않습니다. 단순한 케이스를 빠르게 처리하는 것에 주의를 향할 수 있고 있습니다.