PostgreSQL 정규 표현 식 상용 함수 의 총 결
복잡 한 데이터 처리 가 필요 한 프로그램 에 있어 서 정규 표현 식 은 의심 할 여지없이 매우 유용 한 도구 이다.본 고 는 PostgreSQL 의 정규 표현 식 함수 와 소스 코드 의 일부 함 수 를 논술 하 는 데 중심 을 두 고 있다.
정규 관련 부분의 디 렉 터 리 구조
[root@localhost regex]# pwd
/opt/hgdb-core/src/include/regex
[root@localhost regex]# ll
total 40
-rw-r--r--. 1 postgres postgres 3490 Mar 19 19:00 regcustom.h
-rw-r--r--. 1 postgres postgres 1332 Mar 19 18:59 regerrs.h
-rw-r--r--. 1 postgres postgres 6703 Mar 19 19:00 regex.h
-rw-r--r--. 1 postgres postgres 2353 Mar 19 19:00 regexport.h
-rw-r--r--. 1 postgres postgres 16454 Mar 19 19:00 regguts.h
정규 표현 식 컴 파일, 일치, 방출, 오류 정보 관련 파일 을 다음 에 구체 적 으로 소개 합 니 다.
[root@localhost regex]# pwd
/opt/hgdb-core/src/backend/regex
[root@localhost regex]# ll reg*.c
-rw-r--r--. 1 postgres postgres 55851 Mar 19 19:00 regcomp.c
-rw-r--r--. 1 postgres postgres 3671 Mar 19 18:59 regerror.c
-rw-r--r--. 1 postgres postgres 34873 Mar 19 19:00 regexec.c
-rw-r--r--. 1 postgres postgres 2123 Mar 19 18:59 regfree.c
[root@localhost regex]#
내 장 된 함수 가 regexp. c 에서 구현 되 었 습 니 다.
[root@localhost adt]# pwd
/opt/hgdb-core/src/backend/utils/adt
[root@localhost adt]# ll regexp.c
-rw-r--r--. 1 postgres postgres 34863 Apr 12 02:29 regexp.c
[root@localhost adt]#
내 장 된 함수 설명:
/* src/include/catalog/pg_proc.h */
DATA(insert OID = 2073 ( substring PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 25 "25 25" _null_ _null_ _null_ _null_ _null_ textregexsubstr _null_ _null_ _null_ ));
DESCR("extract text matching regular expression");
DATA(insert OID = 2074 ( substring PGNSP PGUID 14 1 0 0 0 f f f f t f i 3 0 25 "25 25 25" _null_ _null_ _null_ _null_ _null_ "select pg_catalog.substring($1, pg_catalog.similar_escape($2, $3))" _null_ _null_ _null_ ));
DESCR("extract text matching SQL99 regular expression");
DATA(insert OID = 2284 ( regexp_replace PGNSP PGUID 12 1 0 0 0 f f f f t f i 3 0 25 "25 25 25" _null_ _null_ _null_ _null_ _null_ textregexreplace_noopt _null_ _null_ _null_ ));
DESCR("replace text using regexp");
DATA(insert OID = 2285 ( regexp_replace PGNSP PGUID 12 1 0 0 0 f f f f t f i 4 0 25 "25 25 25 25" _null_ _null_ _null_ _null_ _null_ textregexreplace _null_ _null_ _null_ ));
DESCR("replace text using regexp");
DATA(insert OID = 2763 ( regexp_matches PGNSP PGUID 12 1 1 0 0 f f f f t t i 2 0 1009 "25 25" _null_ _null_ _null_ _null_ _null_ regexp_matches_no_flags _null_ _null_ _null_ ));
DESCR("find all match groups for regexp");
DATA(insert OID = 2764 ( regexp_matches PGNSP PGUID 12 1 10 0 0 f f f f t t i 3 0 1009 "25 25 25" _null_ _null_ _null_ _null_ _null_ regexp_matches _null_ _null_ _null_ ));
DESCR("find all match groups for regexp");
DATA(insert OID = 2765 ( regexp_split_to_table PGNSP PGUID 12 1 1000 0 0 f f f f t t i 2 0 25 "25 25" _null_ _null_ _null_ _null_ _null_ regexp_split_to_table_no_flags _null_ _null_ _null_ ));
DESCR("split string by pattern");
DATA(insert OID = 2766 ( regexp_split_to_table PGNSP PGUID 12 1 1000 0 0 f f f f t t i 3 0 25 "25 25 25" _null_ _null_ _null_ _null_ _null_ regexp_split_to_table _null_ _null_ _null_ ));
DESCR("split string by pattern");
DATA(insert OID = 2767 ( regexp_split_to_array PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 1009 "25 25" _null_ _null_ _null_ _null_ _null_ regexp_split_to_array_no_flags _null_ _null_ _null_ ));
DESCR("split string by pattern");
DATA(insert OID = 2768 ( regexp_split_to_array PGNSP PGUID 12 1 0 0 0 f f f f t f i 3 0 1009 "25 25 25" _null_ _null_ _null_ _null_ _null_ regexp_split_to_array _null_ _null_ _null_ ));
매개 변수 종류 및 반환 값 종류:
postgres=# select oid,typname from pg_type where oid = 25 or oid = 1009;
oid | typname
------+---------
25 | text
1009 | _text
(2 rows)
substring (string from pattern) 함 수 는 POSIX 정규 표현 식 모드 와 일치 하 는 하위 문자열 을 문자열 에서 추출 하 는 방법 을 제공 합 니 다.일치 하지 않 으 면 NULL 로 돌아 갑 니 다. 그렇지 않 으 면 텍스트 에서 일치 하 는 패턴 의 부분 입 니 다.
regexp_replace (source, pattern, replacement [, flags]) 함 수 는 POSIX 정규 표현 식 모드 와 일치 하 는 하위 문자열 을 새 텍스트 로 바 꾸 는 기능 을 제공 합 니 다.
regexp_matches (string, pattern [, flags]) 함 수 는 POSIX 정규 표현 식 모드 에서 가 져 온 모든 하위 문자열 결 과 를 가 져 온 text 배열 을 되 돌려 줍 니 다.매개 변수 flags 는 함수 행동 을 바 꾸 기 위해 0 이상 의 알파벳 표 시 를 포함 하여 선택 할 수 있 는 text 문자열 입 니 다.태그 g 는 문자열 의 매 칭 을 찾 습 니 다. 첫 번 째 뿐만 아니 라 매 칭 마다 한 줄 을 되 돌려 줍 니 다.
regexp_split_to_table (string, pattern [, flags]) 함 수 는 POSIX 정규 표현 식 모드 를 구분자 로 하고 문자열 을 구분한다.결 과 를 string 으로 되 돌려 줍 니 다.
regexp_split_to_array (string, pattern [, flags]) 함수 와 regexpsplit_to_table 행동 은 같 지만 결 과 는 text 배열 로 되 돌아 갑 니 다.
참고 사용자 매 뉴 얼 을 구체 적 으로 사용 하 다.
src/include/regex/regex.h
regex_t 구조 체
/* the biggie, a compiled RE (or rather, a front end to same) */
typedef struct
{
int re_magic; /* magic number */
size_t re_nsub; /* number of subexpressions */
long re_info; /* information about RE */
#define REG_UBACKREF 000001
#define REG_ULOOKAHEAD 000002
#define REG_UBOUNDS 000004
#define REG_UBRACES 000010
#define REG_UBSALNUM 000020
#define REG_UPBOTCH 000040
#define REG_UBBS 000100
#define REG_UNONPOSIX 000200
#define REG_UUNSPEC 000400
#define REG_UUNPORT 001000
#define REG_ULOCALE 002000
#define REG_UEMPTYMATCH 004000
#define REG_UIMPOSSIBLE 010000
#define REG_USHORTEST 020000
int re_csize; /* sizeof(character) */
char *re_endp; /* backward compatibility kludge */
Oid re_collation; /* Collation that defines LC_CTYPE behavior */
/* the rest is opaque pointers to hidden innards */
char *re_guts; /* `char *' is more portable than `void *' */
char *re_fns;
} regex_t;
컴 파일 된 정규 표현 식 저장
regmatch_t 구조 체
/* result reporting (may acquire more fields later) */
typedef struct
{
regoff_t rm_so; /* start of substring */
regoff_t rm_eo; /* end of substring */
} regmatch_t;
typedef long regoff_t;
멤버 rmso 대상 문자열 의 시작 위치 에 일치 하 는 텍스트 문자열 을 저장 합 니 다. rmeo 저장 끝 위치.일반적으로 우 리 는 배열 의 형식 으로 이러한 구 조 를 정의 한다.
다음 몇 가지 주요 함수 성명 이 있 습 니 다.
/*
* the prototypes for exported functions
*/
extern int pg_regcomp(regex_t *, const pg_wchar *, size_t, int, Oid);
extern int pg_regexec(regex_t *, const pg_wchar *, size_t, size_t, rm_detail_t *, size_t, regmatch_t[], int);
extern int pg_regprefix(regex_t *, pg_wchar **, size_t *);
extern void pg_regfree(regex_t *);
extern size_t pg_regerror(int, const regex_t *, char *, size_t);
extern void pg_set_regex_collation(Oid collation);
정규 표현 식 을 처리 할 때 자주 사용 하 는 함 수 는 pg 입 니 다.regcomp()、pg_regexec()、pg_regfree () 와 pgregerror()。
일반 처리 절차: 정규 표현 식 pg 컴 파일regcomp (), 정규 표현 식 pg 일치regexec (), 정규 표현 식 pg 방출regfree()。
pg_regerror (): regcomp 나 regexec 를 실행 하 는 중 오류 가 발생 했 을 때 이 함 수 를 호출 하여 오류 정 보 를 포함 하 는 문자열 을 되 돌려 줍 니 다.
매개 변수 설명
int
pg_regcomp(regex_t *re,
const chr *string, /* */
size_t len, /* */
int flags,
Oid collation)
int
pg_regexec(regex_t *re, /* regcomp */
const chr *string, /* */
size_t len, /* */
size_t search_start, /* */
rm_detail_t *details, /* NULL */
size_t nmatch, /* regmatch_t */
regmatch_t pmatch[], /* regmatch_t , */
int flags)
flags
src/backend/utils/adt/regexp.c
/* all the options of interest for regex functions */
typedef struct pg_re_flags
{
int cflags; /* compile flags for Spencer's regex code */
bool glob; /* do it globally (for each occurrence) */
} pg_re_flags;
/*
* parse_re_flags - parse the options argument of regexp_matches and friends
*
* flags --- output argument, filled with desired options
* opts --- TEXT object, or NULL for defaults
*
* This accepts all the options allowed by any of the callers; callers that
* don't want some have to reject them after the fact.
*/
static void
parse_re_flags(pg_re_flags *flags, text *opts)
{
/* regex flavor is always folded into the compile flags */
flags->cflags = REG_ADVANCED;
flags->glob = false;
if (opts)
{
char *opt_p = VARDATA_ANY(opts);
int opt_len = VARSIZE_ANY_EXHDR(opts);
int i;
for (i = 0; i < opt_len; i++)
{
switch (opt_p[i])
{
case 'g':
flags->glob = true;
break;
case 'b': /* BREs (but why???) */
flags->cflags &= ~(REG_ADVANCED | REG_EXTENDED | REG_QUOTE);
break;
case 'c': /* case sensitive */
flags->cflags &= ~REG_ICASE;
break;
case 'e': /* plain EREs */
flags->cflags |= REG_EXTENDED;
flags->cflags &= ~(REG_ADVANCED | REG_QUOTE);
break;
case 'i': /* case insensitive */
flags->cflags |= REG_ICASE;
break;
case 'm': /* Perloid synonym for n */
case 'n': /*
affects ^ $ . [^ */
flags->cflags |= REG_NEWLINE;
break;
case 'p': /* ~Perl,
affects . [^ */
flags->cflags |= REG_NLSTOP;
flags->cflags &= ~REG_NLANCH;
break;
case 'q': /* literal string */
flags->cflags |= REG_QUOTE;
flags->cflags &= ~(REG_ADVANCED | REG_EXTENDED);
break;
case 's': /* single line,
ordinary */
flags->cflags &= ~REG_NEWLINE;
break;
case 't': /* tight syntax */
flags->cflags &= ~REG_EXPANDED;
break;
case 'w': /* weird,
affects ^ $ only */
flags->cflags &= ~REG_NLSTOP;
flags->cflags |= REG_NLANCH;
break;
case 'x': /* expanded syntax */
flags->cflags |= REG_EXPANDED;
break;
default:
ereport(ERROR,
(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
errmsg("invalid regexp option: \"%c\"",
opt_p[i])));
break;
}
}
}
}
옵션
묘사 하 다.
b
나머지 정규 표현 식 은 BR 입 니 다.
c
대소 문자 민감 일치 (덮어 쓰기 연산 자 형식)
e
나머지 정규 표현 식 은 ERE 입 니 다.
i
대소 문자 가 민감 하지 않 은 일치 (덮어 쓰기 연산 자 형식)
m
n 의 역사 동의어
n
신참
p
부분 새 줄 민감 매 칭
q
정규 표현 식 을 텍스트 ("일 으 키 기") 문자열 로 초기 화 합 니 다. 모든 것 이 일반 문자 입 니 다.
s
새 줄 이 아 닌 민감 한 일치 (결 성)
t
문법
w
반전 부분 새 줄 민감 ("괴이") 일치
x
확장 문법
이상 은 바로 PostgreSQL 정규 표현 식 상용 함수 의 실례 상세 한 설명 입 니 다. 궁금 한 점 이 있 으 시 면 메 시 지 를 남기 거나 본 사이트 지역사회 에 가서 토론 을 주 십시오. 읽 어 주 셔 서 감사합니다. 여러분 께 도움 이 되 기 를 바 랍 니 다. 본 사이트 에 대한 지지 에 감 사 드 립 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.