Zusammenfassung der allgemeinen Funktionen von regulären Ausdrücken in PostgreSQL

Zusammenfassung der allgemeinen Funktionen von regulären Ausdrücken in PostgreSQL

Zusammenfassung der allgemeinen Funktionen von regulären Ausdrücken in PostgreSQL

Reguläre Ausdrücke sind zweifellos ein sehr nützliches Werkzeug für Programme, die eine komplexe Datenverarbeitung erfordern. In diesem Artikel werden hauptsächlich einige häufig verwendete reguläre Ausdrucksfunktionen von PostgreSQL sowie einige Funktionen im Quellcode erläutert.

Verzeichnisstruktur des regulären zugehörigen Teils

[root@localhost regulärer Ausdruck]# pwd
/opt/hgdb-core/src/include/regex
[root@localhost regulärer Ausdruck]# ll
insgesamt 40
-rw-r--r--. 1 postgres postgres 3490 19. März 19:00 regcustom.h
-rw-r--r--. 1 postgres postgres 1332 März 19 18:59 regerrs.h
-rw-r--r--. 1 postgres postgres 6703 19. März 19:00 regex.h
-rw-r--r--. 1 postgres postgres 2353 19. März 19:00 regexport.h
-rw-r--r--. 1 postgres postgres 16454 19. März 19:00 regguts.h

Die Kompilierung, Übereinstimmung, Freigabe und Fehlerinformationsdateien für reguläre Ausdrücke werden später ausführlich vorgestellt.

[root@localhost regulärer Ausdruck]# pwd
/opt/hgdb-core/src/backend/regex
[root@localhost regulärer Ausdruck]# ll reg*.c
-rw-r--r--. 1 postgres postgres 55851 19. März 19:00 regcomp.c
-rw-r--r--. 1 postgres postgres 3671 19. März 18:59 regerror.c
-rw-r--r--. 1 postgres postgres 34873 19. März 19:00 regexec.c
-rw-r--r--. 1 postgres postgres 2123 März 19 18:59 regfree.c
[root@localhost regulärer Ausdruck] 

Integrierte Funktionen sind in regexp.c implementiert

[root@localhost adt]# pwd
/opt/hgdb-core/src/backend/utils/adt
[root@localhost adt]# ll regexp.c
-rw-r--r--. 1 postgres postgres 34863 12. April 02:29 regexp.c
[root@localhost adt]#

Integrierte Funktionsdeklaration:

/* src/include/catalog/pg_proc.h */

DATA(OID einfügen = 2073 (Teilzeichenfolge PGNSP PGUID 12 1 0 0 0 fffftfi 2 0 25 "25 25" _null_ _null_ _null_ _null_ _null_ textregexsubstr _null_ _null_ _null_ ));
DESCR("Text extrahieren, der dem regulären Ausdruck entspricht");
DATA(OID einfügen = 2074 (Teilzeichenfolge PGNSP PGUID 14 1 0 0 0 fffftfi 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("Text extrahieren, der dem regulären SQL99-Ausdruck entspricht");

DATEN (OID einfügen = 2284 (regexp_replace PGNSP PGUID 12 1 0 0 0 fffftfi 3 0 25 "25 25 25" _null_ _null_ _null_ _null_ _null_ textregexreplace_noopt _null_ _null_ _null_ ));
DESCR("Text durch regulären Ausdruck ersetzen");
DATA(OID einfügen = 2285 (regexp_replace PGNSP PGUID 12 1 0 0 0 fffftfi 4 0 25 "25 25 25 25" _null_ _null_ _null_ _null_ _null_ textregexreplace _null_ _null_ _null_ ));
DESCR("Text durch regulären Ausdruck ersetzen");

DATEN (OID einfügen = 2763 (regexp_matches PGNSP PGUID 12 1 1 0 0 fffftti 2 0 1009 "25 25" _null_ _null_ _null_ _null_ _null_ regexp_matches_no_flags _null_ _null_ _null_ ));
DESCR("alle Übereinstimmungsgruppen für regulären Ausdruck finden");
DATEN (OID einfügen = 2764 (regexp_matches PGNSP PGUID 12 1 10 0 0 fffftti 3 0 1009 "25 25 25" _null_ _null_ _null_ _null_ _null_ regexp_matches _null_ _null_ _null_ ));
DESCR("alle Übereinstimmungsgruppen für regulären Ausdruck finden");

DATEN (OID einfügen = 2765 (regexp_split_to_table PGNSP PGUID 12 1 1000 0 0 fffftti 2 0 25 "25 25" _null_ _null_ _null_ _null_ _null_ regexp_split_to_table_no_flags _null_ _null_ _null_ ));
DESCR("Zeichenfolge nach Muster aufteilen");
DATEN (OID einfügen = 2766 (regexp_split_to_table PGNSP PGUID 12 1 1000 0 0 fffftti 3 0 25 "25 25 25" _null_ _null_ _null_ _null_ _null_ regexp_split_to_table _null_ _null_ _null_ ));
DESCR("Zeichenfolge nach Muster aufteilen");

DATEN (OID einfügen = 2767 (regexp_split_to_array PGNSP PGUID 12 1 0 0 0 fffftfi 2 0 1009 "25 25" _null_ _null_ _null_ _null_ _null_ regexp_split_to_array_no_flags _null_ _null_ _null_ ));
DESCR("Zeichenfolge nach Muster aufteilen");
DATEN (OID einfügen = 2768 (regexp_split_to_array PGNSP PGUID 12 1 0 0 0 fffftfi 3 0 1009 "25 25 25" _null_ _null_ _null_ _null_ _null_ regexp_split_to_array _null_ _null_ _null_ ));

Parametertypen und Rückgabewerttypen:

postgres=# wähle oid,typname aus pg_type, wobei oid = 25 oder oid = 1009;
 oid | Typname 
------+---------
  25 | Text
 1009 | _text
(2 Reihen)

Die Funktion substring(string from pattern) bietet eine Methode zum Extrahieren einer Teilzeichenfolge aus einer Zeichenfolge, die einem POSIX-regulären Ausdrucksmuster entspricht. Es gibt NULL zurück, wenn keine Übereinstimmung vorliegt, andernfalls den Teil des Textes, der mit dem Muster übereinstimmt.

Die Funktion regexp_replace(source, pattern, replacement [, flags ]) bietet die Möglichkeit, eine Teilzeichenfolge, die einem POSIX-Regular-Ausdrucksmuster entspricht, durch neuen Text zu ersetzen.

Die Funktion regexp_matches(string, pattern[, flags ]) gibt ein Text-Array zurück, das alle Teilzeichenfolgen enthält, die dem POSIX-Muster für reguläre Ausdrücke entsprechen.
Der Flags-Parameter ist eine optionale Textzeichenfolge, die 0 oder mehr einstellige Flags enthält, die das Verhalten der Funktion ändern. Das Flag „g“ bewirkt, dass jede Übereinstimmung in der Zeichenfolge gefunden wird, nicht nur die erste, und jede Übereinstimmung in einer Zeile zurückgegeben wird.

Die Funktion regexp_split_to_table(string, pattern[, flags ]) teilt einen String unter Verwendung eines POSIX-regulären Ausdrucksmusters als Trennzeichen. Das Rückgabeergebnis ist eine Zeichenfolge. .

Die Funktion regexp_split_to_array (string, pattern[, flags ]) verhält sich genauso wie regexp_split_to_table, gibt das Ergebnis jedoch als Textarray zurück.

Informationen zur spezifischen Verwendung finden Sie im Benutzerhandbuch.

src/include/regex/regex.h

regex_t-Struktur

/* das Wichtigste, ein kompiliertes RE (oder vielmehr ein Frontend dafür) */
typedef-Struktur
{
 int re_magic; /* magische Zahl */
 size_t re_nsub; /* Anzahl der Unterausdrücke */
 long re_info; /* Informationen über 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; /* Größe von (Zeichen) */
 char *re_endp; /* Kludge zur Abwärtskompatibilität */
 Oid re_collation; /* Sortierung, die das LC_CTYPE-Verhalten definiert */
 /* der Rest sind undurchsichtige Zeiger auf verborgene Innereien */
 char *re_guts; /* „char *“ ist portabler als „void *“ */
 char *re_fns;
} regex_t;

Kompilierte reguläre Ausdrücke speichern

regmatch_t-Struktur

/* Ergebnisberichterstattung (können später weitere Felder erhalten) */
typedef-Struktur
{
 regoff_t rm_so; /* Beginn der Teilzeichenfolge */
 regoff_t rm_eo; /* Ende der Teilzeichenfolge */
} regmatch_t;

Typdefinition lang regoff_t;

Das Mitglied rm_so speichert die Startposition der übereinstimmenden Textzeichenfolge in der Zielzeichenfolge und rm_eo speichert die Endposition. Normalerweise definieren wir eine Gruppe solcher Strukturen in Form eines Arrays.

Es gibt mehrere Hauptfunktionsdeklarationen:

/*
 * die Prototypen für exportierte Funktionen
 */
extern int pg_regcomp(regex_t *, const pg_wchar *, size_t, int, Oid);
extern int pg_regexec(regex_t *, const pg_wchar *, Größe_t, Größe_t, rm_detail_t *, Größe_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-Sortierung);

Häufig verwendete Funktionen zur Verarbeitung regulärer Ausdrücke sind pg_regcomp(), pg_regexec(), pg_regfree() und pg_regerror().

Allgemeine Verarbeitungsschritte: regulären Ausdruck pg_regcomp() kompilieren, regulären Ausdruck pg_regexec() abgleichen, regulären Ausdruck pg_regfree() freigeben.

pg_regerror(): Wenn beim Ausführen von regcomp oder regexec ein Fehler auftritt, kann diese Funktion aufgerufen werden, um eine Zeichenfolge mit der Fehlermeldung zurückzugeben.

Parameter Beschreibung

int
pg_regcomp(regex_t *re,
   const chr *string, /* regulärer Ausdrucksstring*/
   size_t len, /* Länge der Zeichenfolge mit regulärem Ausdruck*/
   int-Flags,
   Oid-Sortierung)

int
pg_regexec(regex_t *re, /* Regulärer Ausdruck kompiliert mit der Funktion regcomp*/
   const chr *string, /* Zielzeichenfolge*/
   size_t len, /* Zielstringlänge*/
   size_t search_start, /* Passende Startposition*/
   rm_detail_t *details, /* NULL */
   size_t nmatch, /* ist die Länge des regmatch_t-Struktur-Arrays*/
   regmatch_t pmatch[], /* Strukturarray vom Typ regmatch_t, das die Positionsinformationen der übereinstimmenden Textzeichenfolge speichert*/
   int-Flags)

Flaggen

src/backend/utils/adt/regexp.c

/* alle interessanten Optionen für Regex-Funktionen */
Typdefinitionsstruktur pg_re_flags
{
 int cflags; /* Kompilierflags für Spencers Regex-Code */
 bool glob; /* global ausführen (für jedes Vorkommen) */
} pg_re_flags;
/*
 * parse_re_flags - Analysiert das Optionsargument von regexp_matches und verwandten Elementen.
 *
 * flags --- Ausgabeargument, gefüllt mit den gewünschten Optionen
 * opts --- TEXT-Objekt oder NULL für Standardwerte
 *
 * Dies akzeptiert alle Optionen, die von einem der Anrufer zugelassen werden; Anrufer, die
 * möchte nicht, dass einige sie im Nachhinein ablehnen müssen.
 */
statische Leere
parse_re_flags(pg_re_flags *Flags, Text *Optionen)
{
 /* Regex-Variante wird immer in die Kompilierflags integriert */
 Flags->cflags = REG_ADVANCED;
 Flags->Glob = falsch;

 wenn (wählt)
 {
 char *opt_p = VARDATA_ANY(opts);
 int opt_len = VARSIZE_ANY_EXHDR(opts);
 int ich;

 für (i = 0; i < opt_len; i++)
 {
  Schalter (opt_p[i])
  {
  Fall 'g':
   Flags->Glob = wahr;
   brechen;
  Fall 'b': /* BREs (aber warum???) */
   Flags->cflags &= ~(REG_ADVANCED | REG_EXTENDED | REG_QUOTE);
   brechen;
  Fall 'c': /* Groß-/Kleinschreibung beachten */
   Flags->cflags &= ~REG_ICASE;
   brechen;
  Fall „e“: /* einfache EREs */
   Flags->cflags |= REG_EXTENDED;
   Flags->cflags &= ~(REG_ADVANCED | REG_QUOTE);
   brechen;
  Fall 'i': /* Groß-/Kleinschreibung wird nicht beachtet */
   Flags->cflags |= REG_ICASE;
   brechen;
  Fall 'm': /* Perloid-Synonym für n */
  Fall 'n': /* \n betrifft ^ $ . [^ */
   Flags->cflags |= REG_NEWLINE;
   brechen;
  Fall 'p': /* ~Perl, \n betrifft . [^ */
   Flags->cflags |= REG_NLSTOP;
   Flags->cflags &= ~REG_NLANCH;
   brechen;
  Fall 'q': /* Literalzeichenfolge */
   flags->cflags |= REG_QUOTE;
   Flags->cflags &= ~(REG_ADVANCED | REG_EXTENDED);
   brechen;
  Fall „s“: /* einzelne Zeile, \n gewöhnlich */
   Flags->cflags &= ~REG_NEWLINE;
   brechen;
  Fall 't': /* enge Syntax */
   Flags->cflags &= ~REG_EXPANDED;
   brechen;
  Fall 'w': /* seltsam, \n betrifft nur ^ $ */
   Flags->cflags &= ~REG_NLSTOP;
   Flags->cflags |= REG_NLANCH;
   brechen;
  Fall 'x': /* erweiterte Syntax */
   Flags->cflags |= REG_EXPANDED;
   brechen;
  Standard:
   ereport(FEHLER,
    (Fehlercode(ERRCODE_INVALID_PARAMETER_VALUE),
    errmsg("ungültige Regexp-Option: \"%c\"",
     opt_p[i])));
   brechen;
  }
 }
 }
}

Optionen beschreiben
B Der verbleibende reguläre Ausdruck ist BR
C Groß-/Kleinschreibung beachten (überschreibt Operatortyp)
t Die restlichen regulären Ausdrücke sind ERE
ich Groß-/Kleinschreibung ignorieren (überschreibt Operatortyp)
M Historische Synonyme von n
N Neue zeilensensitive Übereinstimmung
P Teilweise Newline-sensitive Übereinstimmung
Q Setzt den regulären Ausdruck auf eine wörtliche („in Anführungszeichen gesetzte“) Zeichenfolge mit allen normalen Zeichen zurück.
S Nicht-Newline-sensitive Übereinstimmung (Standard)
T Strenge Grammatik
m Kehren Sie einen Teil der Zeilenumbruch-sensitiven ("seltsamen") Übereinstimmung um
X Erweiterte Syntax

Oben finden Sie ein ausführliches Beispiel der häufig verwendeten Funktionen von PostgreSQL-regulären Ausdrücken. Wenn Sie Fragen haben, hinterlassen Sie bitte eine Nachricht oder diskutieren Sie in der Community dieser Site. Vielen Dank fürs Lesen und ich hoffe, es kann Ihnen helfen. Vielen Dank für Ihre Unterstützung dieser Site!

Das könnte Sie auch interessieren:
  • SQL-Skriptfunktion zum Schreiben einer PostgreSQL-Datenbank zur Implementierung der Analyse
  • Syntax und Verwendung von Fensterfunktionen in der PostgreSQL-Datenbank
  • Beispiel für die Implementierung einer Funktionsberechnungsmethode in PostgreSQL Node.js
  • Detaillierte Analyse der Verwendung von Sequenzen und verwandten Funktionen in PostgreSQL
  • Detaillierte Erklärung der benutzerdefinierten Postgresql-Funktionen

<<:  JavaScript-Farbbetrachter

>>:  Detaillierte Erläuterung der FTP-Umgebungskonfigurationslösung (vsftpd)

Artikel empfehlen

Lösung für den Fehler bei der MySQL-Remoteverbindung

Ich bin schon einmal auf das Problem gestoßen, da...

Tutorial zur Docker-Installation in einer Linux-Umgebung

1. Installationsumgebung Docker unterstützt die f...

js, um einen Karusselleffekt zu erzeugen

Ich denke, das Karussell ist ein relativ wichtige...

So kapseln Sie Axios in Vue

Inhaltsverzeichnis 1. Installation 1. Einleitung ...

Beschreibung der Nginx-Zugriffsprotokoll- und Fehlerprotokollparameter

veranschaulichen: Es gibt zwei Haupttypen von Ngi...

Der Unterschied zwischen Vue-Interpolationsausdruck und V-Text-Direktive

Inhaltsverzeichnis 1. Verwenden Sie Plugin-Ausdrü...

So legen Sie einen Alias ​​für einen benutzerdefinierten Pfad in Vue fest

So konfigurieren Sie benutzerdefinierte Pfadalias...

Alibaba Cloud Centos7.3-Installation, MySQL5.7.18 RPM-Installations-Tutorial

Deinstallieren Sie MariaDB CentOS7 installiert st...

Lernunterlagen zum Schreiben des ersten Vue-Programms

Inhaltsverzeichnis 1. Schreiben Sie ein HTML, das...