MySQL Reguläre Ausdrücke (Regexp)
⚡ Intelligente Zusammenfassung
MySQL Reguläre Ausdrücke (REGEXP) gleichen Spaltenwerte mit flexiblen Mustern ab, die mit Platzhaltern nicht ausgedrückt werden können. Dies erklärt die REGEXP-Syntax, das Synonym RLIKE, alle unterstützten Metazeichen, korrigierte Abfragebeispiele für die myflixdb-Datenbank und die hinzugefügten regulären Ausdrucksfunktionen. MySQL 8.0

Was sind MySQL reguläre Ausdrücke?
MySQL reguläre Ausdrücke verwenden Reguläre Ausdrücke helfen Ihnen bei der Suche nach Daten, die komplexen Kriterien entsprechen. Ein regulärer Ausdruck ist ein Muster, das die Struktur des gesuchten Wertes beschreibt, anstatt den Wert selbst.
Wenn Sie bereits mit MySQL PlatzhalterMan könnte sich fragen, warum es sich lohnt, reguläre Ausdrücke zu lernen, wenn LIKE ähnliche Ergebnisse liefert. Die Antwort liegt in der Ausdrucksstärke: Wildcards bieten nur zwei Symbole, während reguläre Ausdrücke Zeichenbereiche, Alternativen, Wiederholungen und Wortpositionen in einem einzigen Muster beschreiben.
Nachdem der Zweck erläutert wurde, wird im nächsten Abschnitt die Syntax vorgestellt, die Sie in jeder REGEXP-Abfrage verwenden werden.
Grundlegende Syntax von REGEXP
Die grundlegende Syntax für einen regulären Ausdruck lautet wie folgt.
SELECT * FROM table_name WHERE fieldname REGEXP 'pattern';
HIER:
- „SELECT-Anweisung“ ist der Standard SELECT-Anweisung.
- „WHERE Feldname“ ist der Name der Spalte, auf die der reguläre Ausdruck angewendet wird.
- „REGEXP ‚Muster‘“ — REGEXP ist der Operator für reguläre Ausdrücke, und 'pattern' stellt das zu vergleichende Muster dar. RLIKE ist eine Synonym für REGEXP und liefert die gleichen Ergebnisse. Um Verwechslungen mit dem LIKE-Operator zu vermeiden, ist es besser, REGEXP zu verwenden.
Betrachten wir nun ein praktisches Beispiel.
SELECT * FROM `movies` WHERE `title` REGEXP 'code';
Die obige Abfrage sucht nach allen Filmtiteln, die das Wort „Code“ enthalten. Dabei spielt es keine Rolle, ob „Code“ am Anfang, in der Mitte oder am Ende des Titels steht. Solange der Titel das Muster enthält, wird die entsprechende Zeile zurückgegeben.
Abgleich des Anfangs eines Wertes mit einer Zeichenliste
Angenommen, wir möchten die Filme finden, deren Titel mit a, b, c oder d beginnen, gefolgt von einer beliebigen Anzahl weiterer Zeichen. Um dieses Ergebnis zu erzielen, kombinieren wir eine Zeichenliste mit dem Caret-Metazeichen.
SELECT * FROM `movies` WHERE `title` REGEXP '^[abcd]';
Ausführen des obigen Skripts in MySQL Werkbank Der Vergleich mit der myflixdb-Datenbank liefert folgende Ergebnisse.
| movie_id | Titel | Regisseur | Jahr_veröffentlicht | Kategorie ID |
|---|---|---|---|---|
| 4 | Code Name Black | Edgar Jimz | 2010 | NULL |
| 5 | Papas kleine Mädchen | NULL | 2007 | 8 |
| 6 | Engel und Dämonen | NULL | 2007 | 6 |
| 7 | Davinci Code | NULL | 2007 | 6 |
Im Muster '^[abcd]' erfordert das Caret-Zeichen (^), dass die Suche am Anfang des Wertes beginnt, und die Zeichenliste [abcd] akzeptiert nur Titel, deren erster Buchstabe a, b, c oder d ist. Bei der Standardsortierung wird die Groß-/Kleinschreibung nicht beachtet, weshalb „Code „Name Black“ wird zurückgegeben.
Ausschließen von Zeichen mit einer negierten Zeichenliste
Nun modifizieren wir das Skript und negieren die Zeichenliste, um zu sehen, welche Zeilen zurückgegeben werden.
SELECT * FROM `movies` WHERE `title` REGEXP '^[^abcd]';
Ausführen des obigen Skripts in MySQL Die Abfrage der myflixdb-Datenbank durch Workbench liefert folgende Ergebnisse.
| movie_id | Titel | Regisseur | Jahr_veröffentlicht | Kategorie ID |
|---|---|---|---|---|
| 1 | Fluch der Karibik 4 | Rob Marshall | 2011 | 1 |
| 2 | Sarah Marshal vergessen | Nicholas Stoller | 2008 | 2 |
| 3 | X-Men | 2008 | ||
| 9 | Honey moonERS | Johann Schulz | 2005 | 8 |
| 16 | 67 % schuldig | 2012 | ||
| 17 | Der große Diktator | Chalie Chaplie | 1920 | 7 |
| 18 | Beispielvideo | Anonym | 8 | |
| 19 | Film 3 | John Brown | 1920 | 8 |
Innerhalb einer Zeichenliste ändert das Caret-Zeichen seine Bedeutung: '^[^abcd]' verankert die Übereinstimmung weiterhin am Anfang, während [^abcd] nun alle Titel ausschließt, die mit einem der eingeschlossenen Zeichen beginnen.
Diese beiden Beispiele verwenden nur Anker und Zeichenlisten. Der nächste Abschnitt behandelt den vollständigen Metazeichensatz.
Metazeichen für reguläre Ausdrücke
Die obigen Beispiele zeigen die einfachste Form eines regulären Ausdrucks. Metazeichen ermöglichen die Feinabstimmung einer Mustersuche: Sie drücken Wiederholungen, Alternativen, Bereiche und Positionen aus. Die folgende Tabelle listet alle vom regulären Ausdruck unterstützten Metazeichen auf. MySQL REGEXP-Operator, jeweils mit einem korrigierten Beispiel.
| Saibling | Beschreibung | Beispiel | |
|---|---|---|---|
| * | Das Sternchen (*) stimmt mit null (0) oder mehr Instanzen des einzelnes Zeichen das davor. | SELECT * FROM movies WHERE title REGEXP 'da*'; entspricht einem „d“, gefolgt von null oder mehr „a“, also Da Vinci Code Auch „Daddy's Little Girls“ sind qualifiziert. Verwenden Sie „da+“, wenn der Buchstabe „a“ unbedingt vorhanden sein muss. | |
| + | Das plus (+) Stimmt mit einem oder mehreren Vorkommen des vorhergehenden Zeichens überein. | SELECT * FROM `movies` WHERE `title` REGEXP 'mon+'; Zeigt alle Filme an, die „mon“ gefolgt von einem oder mehreren „n“-Zeichen enthalten. Zum Beispiel: Illuminati. | |
| ? | Das Fragezeichen (?) Passt zu null (0) oder genau einem Vorkommen des vorhergehenden Zeichens. | SELECT * FROM `categories` WHERE `category_name` REGEXP 'com?'; „co“ wird mit einem optionalen „m“ kombiniert. Zum Beispiel: Komödie und romantische Komödie. | |
| . | Das Punkt (.) Passt auf jedes einzelne Zeichen außer einem Zeilenumbruch. | SELECT * FROM movies WHERE `year_released` REGEXP '200.'; Zeigt alle Filme an, die in einem Jahr mit der Jahreszahl „200“ gefolgt von einem beliebigen Buchstaben erschienen sind. Zum Beispiel: 2005, 2007, 2008. | |
| [ABC] | Das Zeichenliste [abc] entspricht einem der eingeschlossenen Zeichen. | SELECT * FROM `movies` WHERE `title` REGEXP '[vwxyz]'; Zeigt alle Filme an, in denen eine der Figuren aus „vwxyz“ vorkommt. Zum Beispiel X-Men und Da Vinci. Code. | |
| [^ abc] | Das negierte Liste [^abc] Passt auf alle Zeichen außer den eingeschlossenen. | SELECT * FROM `movies` WHERE `title` REGEXP '^[^vwxyz]'; listet alle Filme auf, deren Titel nicht mit einem Buchstaben aus „vwxyz“ beginnt. | |
| [AZ] | Das Reichweite [AZ] Passt zu jedem Großbuchstaben. | SELECT * FROM `members` WHERE `postal_address` REGEXP '[AZ]'; Gibt alle Mitglieder an, deren Postanschrift einen Buchstaben zwischen A und Z enthält. Zum Beispiel Janet Jones mit der Mitgliedsnummer 1. | |
| [az] | Das Bereich [az] Passt zu jedem Kleinbuchstaben. | SELECT * FROM `members` WHERE `postal_address` REGEXP '[az]'; Gibt alle Mitglieder an, deren Postanschrift einen Buchstaben zwischen a und z enthält. Beachten Sie, dass die Standardsortierung nicht zwischen Groß- und Kleinschreibung unterscheidet, sodass dieser Bereich auch Großbuchstaben umfasst. | |
| [0-9] | Das Bereich [0-9] Passt zu jeder Ziffer von 0 bis 9. | SELECT * FROM `members` WHERE `contact_number` REGEXP '[0-9]'; Zeigt alle Mitglieder an, deren Kontaktnummer mindestens eine Ziffer enthält. Zum Beispiel Robert Phil. | |
| ^ | Das Caretzeichen (^) Verankert die Übereinstimmung am Anfang des Wertes. | SELECT * FROM `movies` WHERE `title` REGEXP '^[cd]'; Zeigt alle Filme an, deren Titel mit „c“ oder „d“ beginnt. Zum Beispiel: Code Name Black, Daddy's Little Girls und Da Vinci Code. | |
| $ | Das Dollarzeichen ($) Verankert die Übereinstimmung am Ende des Wertes. | SELECT * FROM `movies` WHERE `title` REGEXP 'code$'; Zeigt alle Filme an, deren Titel mit „Code“ endet. Zum Beispiel Davinci Code. | |
| | | Das vertikaler Balken (|) isoliert Alternativen. | SELECT * FROM `movies` WHERE `title` REGEXP '^[cd]|^[u]'; Zeigt alle Filme an, deren Titel mit „c“, „d“ oder „u“ beginnt. Zum Beispiel: Code Name Black, Da Vinci Codeund Unterwelt – Awakening. | |
| \b | Das Wortgrenze (\b) Es passt zum Anfang oder Ende eines Wortes. Es ersetzt die älteren Marker [[:<:]] und [[:>:]], die MySQL 8.0 entfernt. | SELECT * FROM `movies` WHERE `title` REGEXP '\\bfor'; Zeigt alle Filme an, deren Name mit „for“ beginnt. Zum Beispiel: Nie wieder Sex mit der Ex. MySQL 5.7 Das entsprechende Muster ist '[[:<:]]for'. | |
| [[:Klasse:]] | Das Zeichenklasse Entspricht einer benannten Zeichengruppe: [[:alpha:]] für Buchstaben, [[:space:]] für Leerzeichen, [[:punct:]] für Satzzeichen und [[:upper:]] für Großbuchstaben. Beachten Sie die doppelt eckige Klammern. | SELECT * FROM `movies` WHERE `title` REGEXP '^[[:alpha:][:space:]]+$'; Es werden alle Filme angezeigt, deren Titel nur Buchstaben und Leerzeichen enthält. Zum Beispiel „Nie wieder Sex mit der Ex“, während „Fluch der Karibik 4“ aufgrund der Ziffer ausgelassen wird. | |
Der Backslash (\) ist das Escape-Zeichen. MySQL Die Zeichenkette wird zuerst analysiert, das Muster anschließend. Ein einfacher Backslash muss innerhalb eines REGEXP-Musters als doppelter Backslash (\\) geschrieben werden.
⚠️ Versionswarnung: MySQL Version 8.0.4 ersetzte die alte Engine für reguläre Ausdrücke durch die ICU-Bibliothek. Die Wortmarker [[:<:]] und [[:>:]] wurden in dieser Version entfernt, sodass aus älteren Versionen kopierte Muster mit einem Syntaxfehler fehlschlagen. MySQL 8.0. Verwenden Sie stattdessen \b.
Nachdem nun alle Metazeichen definiert sind, stellt sich die berechtigte Frage: Wann sollte REGEXP den einfacheren LIKE-Operator ersetzen?
REGEXP vs LIKE: Welchen Ausdruck sollten Sie verwenden?
Beide Operatoren filtern Zeilen anhand eines Musters, lösen aber unterschiedliche Probleme. LIKE versteht nur zwei Symbole, während REGEXP den gesamten oben gezeigten Metazeichensatz versteht. Diese Flexibilität hat ihren Preis; die Wahl ist daher eher ein Kompromiss als eine Frage der Präferenz.
| Kriterium | LIKE | REGEXP |
|---|---|---|
| Mustersymbole | % und _ nur | Anchors, Bereiche, Alternation, Quantoren, Zeichenklassen |
| Typische Verwendung | Präfix-, Suffix- und „enthält“-Suchen | Validierung, mehrere Alternativen, positionsabhängige Zuordnung |
| Indexnutzung | Möglich, wenn das Muster nicht mit % beginnt. | Verwendet niemals einen Index |
| Rückgabewert | Richtig oder falsch | 1 oder 0, und NULL, wenn einer der Operanden NULL ist. |
Wählen Sie LIKE für einfache Suchmuster, da es gut lesbar ist und einen Index verwenden kann. Verwenden Sie REGEXP, wenn ein einzelnes Muster mehrere Regeln gleichzeitig ausdrücken soll, z. B. „beginnt mit c oder d und endet mit einer Ziffer“. Bei großen Tabellen sollten Sie die Zeilen zunächst mithilfe einer indizierten Bedingung eingrenzen und anschließend REGEXP auf die verkleinerte Menge anwenden.
MySQL 8.0 Funktionen für reguläre Ausdrücke
Der REGEXP-Operator beantwortet nur eine Frage: Stimmt der Wert mit dem Muster überein? MySQL Version 8.0 fügte vier weitere Funktionen hinzu, die es Ihnen ermöglichen, z. B. zu finden.tract und schreibt den übereinstimmenden Text um. Jede Funktion akzeptiert ein optionales Argument match_type, wobei 'c' einen Vergleich mit Berücksichtigung der Groß-/Kleinschreibung und 'i' einen Vergleich ohne Berücksichtigung der Groß-/Kleinschreibung erzwingt.
- REGEXP_LIKE(expr, pattern) Gibt 1 zurück, wenn der Wert dem Muster entspricht. Es handelt sich um die Funktionsform des REGEXP-Operators, und das Argument match_type macht die Groß-/Kleinschreibung explizit relevant.
- REGEXP_INSTR(expr, pattern) Gibt die Position des ersten Zeichens der Übereinstimmung zurück, oder 0, wenn das Muster nicht gefunden wird.
- REGEXP_SUBSTR(expr, pattern) Gibt die übereinstimmende Teilzeichenkette selbst zurück, was nützlich ist, um beispielsweise ein Jahr, einen Code oder eine Zahl aus einem längeren Textwert zu extrahieren.
- REGEXP_REPLACE(expr, pattern, replacement) Gibt den Wert zurück, wobei jede Übereinstimmung ersetzt wurde, sodass Daten innerhalb eines SQL-UPDATE-Abfrage.
SELECT title, REGEXP_SUBSTR(title, '[0-9]+') AS number_in_title FROM `movies` WHERE REGEXP_LIKE(title, '[0-9]');
Die obige Abfrage liefert alle Filmtitel, die eine Ziffer enthalten, zusammen mit den Ziffern selbst. MySQL 5.7 Da diese Funktionen nicht verfügbar sind, bleibt der REGEXP-Operator die einzige Option.
