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

So installieren Sie Oracle Java 14 auf Ubuntu Linux

Vor Kurzem hat Oracle die öffentliche Verfügbarke...

Docker-Kern und spezifische Verwendung der Installation

1. Was ist Docker? (1) Docker ist ein Open-Source...

MySQL 8.0.19 Installations-Tutorial

Laden Sie das Installationspaket von der offiziel...

Kleines Programm zur Implementierung eines einfachen Taschenrechners

In diesem Artikelbeispiel wird der spezifische Co...

JavaScript, um einen ausgefallenen Karusselleffekt zu erzielen

In diesem Artikel werden zwei Methoden zur Implem...

WeChat-Applet-Beispiel für die direkte Verwendung von Funktionen in {{ }}

Vorwort Bei der WeChat-Applet-Entwicklung (native...

MySQL Online-DDL-Tool Gh-Ost-Prinzipanalyse

Inhaltsverzeichnis 1. Einleitung 1.1 Grundsatz 1....

So aktivieren Sie Flash in Windows Server 2016

Ich habe vor Kurzem VMware Horizon bereitgestellt...

So packen Sie das Projekt per Idee in Docker

Viele Freunde wollten schon immer wissen, wie man...

MySQL 5.7.12 Installations- und Konfigurations-Tutorial unter Mac OS 10.11

So installieren und konfigurieren Sie MySQL auf M...