PostgreSQL 정규 표현 식 상용 함수 의 총 결

11659 단어
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 정규 표현 식 상용 함수 의 실례 상세 한 설명 입 니 다. 궁금 한 점 이 있 으 시 면 메 시 지 를 남기 거나 본 사이트 지역사회 에 가서 토론 을 주 십시오. 읽 어 주 셔 서 감사합니다. 여러분 께 도움 이 되 기 를 바 랍 니 다. 본 사이트 에 대한 지지 에 감 사 드 립 니 다!

좋은 웹페이지 즐겨찾기