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. 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; } } } }
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:
|
>>: Detaillierte Erläuterung der FTP-Umgebungskonfigurationslösung (vsftpd)
Ich habe js verwendet, um ein Paket zur Konvertie...
Ich bin schon einmal auf das Problem gestoßen, da...
1. Installationsumgebung Docker unterstützt die f...
Ich denke, das Karussell ist ein relativ wichtige...
1. Einrichten des virtuellen Nginx-Hosts Mit virt...
Inhaltsverzeichnis 1. Installation 1. Einleitung ...
veranschaulichen: Es gibt zwei Haupttypen von Ngi...
Dieser Artikel stellt Nginx ausführlich vor, von ...
1. Hintergrund Obwohl ich viele Blogs und Artikel...
Inhaltsverzeichnis 1. Verwenden Sie Plugin-Ausdrü...
Hintergrund PNG-Bilder benötigen mehr Speicherpla...
So konfigurieren Sie benutzerdefinierte Pfadalias...
Deinstallieren Sie MariaDB CentOS7 installiert st...
Inhaltsverzeichnis 1. Schreiben Sie ein HTML, das...
In diesem Artikel wird ein JS-Spezialeffekt vorge...