regex(3) - wariua/manpages-ko GitHub Wiki

NAME

regcomp, regexec, regerror, regfree - POSIX μ •κ·œ ν‘œν˜„μ‹ ν•¨μˆ˜

SYNOPSIS

#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);

DESCRIPTION

POSIX μ •κ·œ ν‘œν˜„μ‹ 컴파일

regcomp()λ₯Ό μ‚¬μš©ν•΄ μ΄μ–΄μ§€λŠ” regexec() 검색에 μ ν•©ν•œ ν˜•νƒœλ‘œ μ •κ·œ ν‘œν˜„μ‹μ„ 컴파일 ν•œλ‹€.

regcomp()에 μ£ΌλŠ” pregλŠ” νŒ¨ν„΄ 버퍼 μ €μž₯ 곡간에 λŒ€ν•œ 포인터이고, regexλŠ” 널 μ’…λ£Œ λ¬Έμžμ—΄μ— λŒ€ν•œ 포인터, cflagsλŠ” 컴파일 방식을 κ²°μ •ν•˜λŠ” ν”Œλž˜κ·Έλ“€μ΄λ‹€.

λͺ¨λ“  μ •κ·œ ν‘œν˜„μ‹ 검색은 컴파일 된 νŒ¨ν„΄ 버퍼λ₯Ό 톡해 이뀄져야 ν•œλ‹€. λ”°λΌμ„œ regexec()μ—λŠ” 항상 regcomp()둜 μ΄ˆκΈ°ν™” ν•œ νŒ¨ν„΄ λ²„νΌμ˜ μ£Όμ†Œλ₯Ό μ€˜μ•Ό ν•œλ‹€.

cflagsμ—λŠ” λ‹€μŒμ„ 0개 이상 λΉ„νŠΈ OR ν•  수 μžˆλ‹€.

REG_EXTENDED
regexλ₯Ό 해석할 λ•Œ POSIX ν™•μž₯ μ •κ·œ ν‘œν˜„μ‹ 문법을 μ“΄λ‹€. 섀정돼 μžˆμ§€ μ•ŠμœΌλ©΄ POSIX κΈ°λ³Έ μ •κ·œ ν‘œν˜„μ‹ 문법을 μ“΄λ‹€.
REG_ICASE
λŒ€μ†Œλ¬Έμžλ₯Ό κ΅¬λ³„ν•˜μ§€ μ•ŠλŠ”λ‹€. 이 νŒ¨ν„΄ 버퍼λ₯Ό μ“°λŠ” 후속 regexec()μ—μ„œ λŒ€μ†Œλ¬Έμžλ₯Ό λ¬΄μ‹œν•˜κ²Œ λœλ‹€.
REG_NOSUB
일치 μœ„μΉ˜λ₯Ό μ•Œλ € μ£Όμ§€ μ•ŠλŠ”λ‹€. 이 ν”Œλž˜κ·Έλ₯Ό μ„€μ •ν•΄μ„œ 컴파일 ν•œ νŒ¨ν„΄ 버퍼λ₯Ό μ“°λ©΄ regexec()μ—μ„œ nmatch 및 pmatch 인자λ₯Ό λ¬΄μ‹œν•œλ‹€.
REG_NEWLINE

μž„μ˜ 문자 일치 μ—°μ‚°μžκ°€ κ°œν–‰μ— μΌμΉ˜ν•˜μ§€ μ•ŠλŠ”λ‹€.

κ°œν–‰μ„ ν¬ν•¨ν•˜μ§€ μ•Šμ€ λΉ„μΌμΉ˜ λͺ©λ‘([^...])이 κ°œν–‰μ— μΌμΉ˜ν•˜μ§€ μ•ŠλŠ”λ‹€.

regexec() μ‹€ν–‰ ν”Œλž˜κ·Έ eflags에 REG_NOTBOL이 μžˆλŠ”μ§€μ™€ λ¬΄κ΄€ν•˜κ²Œ ν–‰ μ‹œμž‘ 일치 μ—°μ‚°μž(^)κ°€ κ°œν–‰ λ°”λ‘œ λ‹€μŒμ˜ 빈 λ¬Έμžμ—΄μ— μΌμΉ˜ν•œλ‹€.

eflags에 REG_NOTEOL이 μžˆλŠ”μ§€μ™€ λ¬΄κ΄€ν•˜κ²Œ ν–‰ μ’…λ£Œ μ—°μ‚°μž($)κ°€ κ°œν–‰ λ°”λ‘œ μ „μ˜ 빈 λ¬Έμžμ—΄μ— μΌμΉ˜ν•œλ‹€.

POSIX μ •κ·œ ν‘œν˜„μ‹ 일치 검사

regexec()λ₯Ό μ‚¬μš©ν•΄ 미리 컴파일 ν•œ νŒ¨ν„΄ 버퍼 preg에 널 μ’…λ£Œ λ¬Έμžμ—΄μ„ 맞좰 λ³Έλ‹€. nmatch와 pmatchλ₯Ό 톡해 일치 μœ„μΉ˜λ“€μ— λŒ€ν•œ 정보λ₯Ό μ œκ³΅ν•œλ‹€. eflagsμ—λŠ” REG_NOTBOLκ³Ό REG_NOTEOL을 λΉ„νŠΈ OR ν•  수 μžˆλŠ”λ° 일치 방식이 μ•„λž˜ μ„€λͺ…μ²˜λŸΌ 바뀐닀.

REG_NOTBOL
ν–‰ μ‹œμž‘ 일치 μ—°μ‚°μžκ°€ 항상 μΌμΉ˜μ— μ‹€νŒ¨ν•œλ‹€. (ν•˜μ§€λ§Œ μœ„μ˜ 컴파일 ν”Œλž˜κ·Έ REG_NEWLINE μ°Έκ³ .) λ¬Έμžμ—΄μ„ λΆ€λΆ„ λΆ€λΆ„μ”© regexec()둜 μ „λ‹¬ν•˜κΈ° λ•Œλ¬Έμ— λ¬Έμžμ—΄ μ‹œμž‘μ„ ν–‰μ˜ μ‹œμž‘μœΌλ‘œ ν•΄μ„ν•˜μ§€ 말아야 ν•  λ•Œ 이 ν”Œλž˜κ·Έλ₯Ό μ“Έ 수 μžˆλ‹€.
REG_NOTEOL
ν–‰ μ’…λ£Œ 일치 μ—°μ‚°μžκ°€ 항상 μΌμΉ˜μ— μ‹€νŒ¨ν•œλ‹€. (ν•˜μ§€λ§Œ μœ„μ˜ 컴파일 ν”Œλž˜κ·Έ REG_NEWLINE μ°Έκ³ .)

λ°”μ΄νŠΈ μœ„μΉ˜

νŒ¨ν„΄ 버퍼λ₯Ό 컴파일 ν•  λ•Œ REG_NOSUBλ₯Ό μ„€μ •ν•œ κ²½μš°κ°€ μ•„λ‹ˆλ©΄ 일치 μœ„μΉ˜ 정보λ₯Ό μ–»λŠ” 게 κ°€λŠ₯ν•˜λ‹€. pmatchλŠ” μ΅œμ†Œ nmatch 개 ν•­λͺ©μ΄ λ“€μ–΄κ°€λŠ” 크기여야 ν•œλ‹€. regexec()μ—μ„œ pmatch에 λΆ€λΆ„μ—΄ 일치 μœ„μΉ˜λ₯Ό μ±„μš΄λ‹€. i 번째 μ—΄λ¦° κ΄„ν˜Έμ—μ„œ μ‹œμž‘ν•˜λŠ” λΆ€λΆ„μ‹μ˜ μœ„μΉ˜κ°€ pmatch[i]에 μ €μž₯λœλ‹€. 그리고 전체 μ •κ·œ ν‘œν˜„μ‹μ˜ 일치 μœ„μΉ˜κ°€ pmatch[0]에 μ €μž₯λœλ‹€. (ν•˜μœ„μ‹ 일치 μœ„μΉ˜ N 개λ₯Ό λ°›μœΌλ €λ©΄ nmatchκ°€ μ΅œμ†Œ N+1이어야 ν•œλ‹€.) μ•ˆ 쓰인 ꡬ쑰체 ν•­λͺ©μ—λŠ” -1 값이 λ‹΄κΈ°κ²Œ λœλ‹€.

pmatch의 νƒ€μž…μΈ regmatch_t κ΅¬μ‘°μ²΄λŠ” <regex.h>에 μ •μ˜λΌ μžˆλ‹€.

typedef struct {
    regoff_t rm_so;
    regoff_t rm_eo;
} regmatch_t;

-1 μ•„λ‹Œ rm_so ν•­λͺ©μ€ λ¬Έμžμ—΄ λ‚΄μ—μ„œ κ°€μž₯ 큰 λ‹€μŒ 일치 λΆ€λΆ„μ—΄μ˜ μ‹œμž‘ μœ„μΉ˜λ₯Ό λ‚˜νƒ€λ‚Έλ‹€. rm_eo ν•­λͺ©μ€ 일치 λΆ€λΆ„ 끝을 μƒλŒ€μ μœΌλ‘œ λ‚˜νƒ€λ‚΄λŠ”λ°, 일치 ν…μŠ€νŠΈ λ‹€μŒ 첫 문자의 μœ„μΉ˜μ΄λ‹€.

POSIX 였λ₯˜ 보고

regerror()λ₯Ό μ΄μš©ν•΄ regcomp() 및 regexec()κ°€ λ°˜ν™˜ν•˜λŠ” 였λ₯˜ μ½”λ“œλ₯Ό 였λ₯˜ λ©”μ‹œμ§€ λ¬Έμžμ—΄λ‘œ λ°”κΎΌλ‹€.

였λ₯˜ μ½”λ“œ errcode, νŒ¨ν„΄ 버퍼 preg, λ¬Έμžμ—΄ 버퍼에 λŒ€ν•œ 포인터 errbuf, κ·Έ λ¬Έμžμ—΄ λ²„νΌμ˜ 크기 errbuf_sizeλ₯Ό regerror()에 μ€€λ‹€. 그러면 널 μ’…λ£Œ 였λ₯˜ λ©”μ‹œμ§€ λ¬Έμžμ—΄μ„ λ‹΄λŠ” 데 ν•„μš”ν•œ errbuf의 크기λ₯Ό λ°˜ν™˜ν•œλ‹€. errbuf와 errbuf_size λͺ¨λ‘ 0이 μ•„λ‹ˆλ©΄ errbuf에 였λ₯˜ λ©”μ‹œμ§€μ˜ 처음 errbuf_size - 1 개 λ¬Έμžμ™€ μ’…λ£Œ 널 λ°”μ΄νŠΈ('\0')λ₯Ό μ±„μš΄λ‹€.

POSIX νŒ¨ν„΄ 버퍼 ν•΄μ œ

컴파일 된 νŒ¨ν„΄ 버퍼 pregλ₯Ό regfree()에 μ£Όλ©΄ regcomp()μ—μ„œ 컴파일 ν•˜λ©° νŒ¨ν„΄ 버퍼에 ν• λ‹Ήν•œ λ©”λͺ¨λ¦¬λ₯Ό ν•΄μ œν•œλ‹€.

RETURN VALUE

regcomp()λŠ” 컴파일 성곡 μ‹œ 0을 λ°˜ν™˜ν•˜λ©° μ‹€νŒ¨ μ‹œ 였λ₯˜ μ½”λ“œλ₯Ό λ°˜ν™˜ν•œλ‹€.

regexec()λŠ” 일치 성곡 μ‹œ 0을 λ°˜ν™˜ν•˜λ©° μ‹€νŒ¨ μ‹œ REG_NOMATCHλ₯Ό λ°˜ν™˜ν•œλ‹€.

ERRORS

regcomp()κ°€ λ‹€μŒ 였λ₯˜λ₯Ό λ°˜ν™˜ν•  수 μžˆλ‹€.

REG_BADBR
μ—­μ°Έμ‘° μ—°μ‚°μž μ‚¬μš© 였λ₯˜.
REG_BADPAT
κ·Έλ£Ήμ΄λ‚˜ λͺ©λ‘ 같은 νŒ¨ν„΄ μ—°μ‚°μž μ‚¬μš© 였λ₯˜.
REG_BADRPT
'*'λ₯Ό 첫 문자둜 μ“°λŠ” 것 같은 반볡 μ—°μ‚°μž μ‚¬μš© 였λ₯˜.
REG_EBRACE
μ€‘κ΄„ν˜Έ ꡬ간 μ—°μ‚°μž 짝 μ•ˆ 맞음.
REG_EBRACK
λŒ€κ΄„ν˜Έ λͺ©λ‘ μ—°μ‚°μž 짝 μ•ˆ 맞음.
REG_ECOLLATE
μ‘°ν•© μš”μ†Œ 였λ₯˜.
REG_ECTYPE
문자 클래슀 이름 잘λͺ»λ¨.
REG_EEND
λΆˆνŠΉμ • 였λ₯˜. POSIX.2μ—λŠ” κ·œμ •λΌ μžˆμ§€ μ•ŠμŒ.
REG_EESCAPE
끝에 λ°±μŠ¬λž˜μ‹œ.
REG_EPAREN
κ΄„ν˜Έ κ·Έλ£Ή μ—°μ‚°μž 짝 μ•ˆ 맞음.
REG_ERANGE
λ²”μœ„ μ—°μ‚°μž μ‚¬μš© 였λ₯˜. 예λ₯Ό λ“€μ–΄ λ²”μœ„ 끝점이 μ‹œμž‘μ  μ•žμ— λ‚˜μ˜΄.
REG_ESIZE
컴파일 된 μ •κ·œ ν‘œν˜„μ‹μ— 64 kB λ„˜λŠ” νŒ¨ν„΄ 버퍼가 ν•„μš”ν•¨. POSIX.2μ—λŠ” κ·œμ •λΌ μžˆμ§€ μ•ŠμŒ.
REG_ESPACE
regex 루틴 μ‹€ν–‰ 쀑 λ©”λͺ¨λ¦¬ λΆ€μ‘±.
REG_ESUBREG
잘λͺ»λœ ν•˜μœ„μ‹ μ—­μ°Έμ‘°.

ATTRIBUTES

이 μ ˆμ—μ„œ μ‚¬μš©ν•˜λŠ” μš©μ–΄λ“€μ— λŒ€ν•œ μ„€λͺ…은 attributes(7)λ₯Ό 보라.

μΈν„°νŽ˜μ΄μŠ€ 속성 κ°’
regcomp(), regexec() μŠ€λ ˆλ“œ μ•ˆμ „μ„± MT-Safe locale
regerror() μŠ€λ ˆλ“œ μ•ˆμ „μ„± MT-Safe env
regfree() μŠ€λ ˆλ“œ μ•ˆμ „μ„± MT-Safe

CONFORMING TO

POSIX.1-2001, POSIX.1-2008.

SEE ALSO

grep(1), regex(7)

glibc 맀뉴얼 Regular Expressions 절


2019-03-06

⚠️ **GitHub.com Fallback** ⚠️