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

  • 🔍 Core Operator: REGEXP vergleicht eine Spalte mit einem Muster und gibt bei einer Übereinstimmung 1 zurück, während RLIKE ein exaktes Synonym für REGEXP ist.
  • 🧩 Schnittmuster Anchors: Das Caret-Zeichen (^) verankert die Übereinstimmung am Anfang des Wertes, das Dollarzeichen ($) am Ende.
  • 🔤 Charakterlisten: [abcd] entspricht jedem eingeschlossenen Zeichen, und [^abcd] schließt jedes eingeschlossene Zeichen aus der Ergebnismenge aus.
  • Quantifizierer: Sternchen, Pluszeichen und Fragezeichen beziehen sich auf das einzelne Zeichen, das ihnen vorangeht, nicht auf die gesamte Zeichenkette.
  • 🛡️ Escaping Regel: Ein buchstäblicher Backslash muss innerhalb eines Musters verdoppelt werden, weil MySQL verarbeitet die Zeichenkette zweimal.
  • 🆕 Versionsänderung: MySQL 8.0 wurde auf die ICU-Engine umgestellt, [[:<:]] und [[:>:]] wurden durch \b ersetzt und REGEXP_LIKE, REGEXP_REPLACE, REGEXP_SUBSTR und REGEXP_INSTR wurden hinzugefügt.
  • Leistungshinweis: REGEXP verwendet niemals einen Index. Filtern Sie daher die Zeilen zunächst mit einer indizierten Bedingung, sofern die Abfrage dies zulässt.

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.

Häufig gestellte Fragen

Standardmäßig nicht. REGEXP richtet sich nach der Sortierung der Spalte, und die Standardsortierungen unterscheiden nicht zwischen Groß- und Kleinschreibung. Um einen Vergleich unter Berücksichtigung der Groß-/Kleinschreibung zu erzwingen, fügen Sie das Schlüsselwort BINARY vor der Spalte ein oder rufen Sie REGEXP_LIKE mit dem Übereinstimmungstyp 'c' auf.

Es gibt keinen funktionalen Unterschied. RLIKE ist ein Synonym für REGEXP. MySQL Aus Kompatibilitätsgründen wird REGEXP bevorzugt. In der Praxis ist REGEXP vorzuziehen, da RLIKE leicht mit dem nicht verwandten Ausdruck verwechselt werden kann. WIE Operator Wird für Platzhalter verwendet.

REGEXP kann keinen Index verwenden, daher MySQL Das Muster wird zeilenweise ausgewertet. Zuerst werden die gescannten Zeilen mithilfe einer Indexbedingung, eines Datumsbereichs oder eines Volltextindexes reduziert, und anschließend wird der reguläre Ausdruck auf das kleinere Ergebnis angewendet.

Ja. KI-Assistenten wandeln eine Regel in Klartext in ein reguläres Ausdrucksmuster um und erklären jedes Metazeichen. Testen Sie das Ergebnis in MySQL Werkbank gegen Beispielzeilen, da ein einziger falsch platzierter Anker das gesamte Ergebnis verändert.

Ja. KI-Assistenten generieren REGEXP_REPLACE-Anweisungen, die Satzzeichen entfernen, Telefonnummern normalisieren oder überflüssige Leerzeichen entfernen. Führen Sie das Muster zuerst innerhalb einer SELECT-Anweisung aus, überprüfen Sie die geänderten Werte und wenden Sie es erst dann in einer anderen Anweisung an. UPDATE-Anweisung.

Fassen Sie diesen Beitrag mit folgenden Worten zusammen: