sql >> Database >  >> RDS >> Mysql

3 manieren om te detecteren of een string overeenkomt met een reguliere expressie in MySQL

MySQL heeft een aantal functies en operators waarmee we bewerkingen kunnen uitvoeren met behulp van reguliere expressies (regex). Dit artikel presenteert twee operators en één functie waarmee we kunnen achterhalen of een tekenreeks overeenkomt met een reguliere expressie die is gespecificeerd door een bepaald patroon.

Deze regexfuncties en operators zijn:

  • REGEXP_LIKE()
  • REGEXP
  • RLIKE

Deze zijn in principe allemaal equivalent, aangezien de operatoren (de tweede twee) beide synoniemen zijn van de functie (de eerste). In ieder geval zie je hieronder voorbeelden van alle drie in actie.

De REGEXP_LIKE() Functie

Laten we eerst eens kijken naar de functie. Hier is een voorbeeld van het uitvoeren van een regex-zoekopdracht met de REGEXP_LIKE() functie:

SELECT 
  REGEXP_LIKE('Car', '^C') AS 'Match',
  REGEXP_LIKE('Bar', '^C') AS 'No Match';

Resultaat:

+-------+----------+
| Match | No Match |
+-------+----------+
|     1 |        0 |
+-------+----------+

De eerste tekenreeks komt overeen (omdat deze begint met C ) dus het resultaat is 1 . De tweede string komt niet overeen en dus is het resultaat 0 .

Deze functie kan echter veel nuttiger zijn dan het simpelweg retourneren van een 1 of 0 . Het kan bijvoorbeeld worden toegevoegd aan de WHERE clausule bij het opvragen van een database. In dit geval kunnen we een lijst met rijen krijgen die een overeenkomst voor het patroon bevatten.

Hier is een voorbeeld:

SELECT AlbumId, AlbumName
FROM Albums
WHERE REGEXP_LIKE(AlbumName, '^Power');

Resultaat:

+---------+------------+
| AlbumId | AlbumName  |
+---------+------------+
|       1 | Powerslave |
|       2 | Powerage   |
+---------+------------+

Hier is de volledige tabel:

SELECT AlbumId, AlbumName
FROM Albums;

Resultaat:

+---------+--------------------------+
| AlbumId | AlbumName                |
+---------+--------------------------+
|       1 | Powerslave               |
|       2 | Powerage                 |
|       3 | Singing Down the Lane    |
|       4 | Ziltoid the Omniscient   |
|       5 | Casualties of Cool       |
|       6 | Epicloud                 |
|       7 | Somewhere in Time        |
|       8 | Piece of Mind            |
|       9 | Killers                  |
|      10 | No Prayer for the Dying  |
|      11 | No Sound Without Silence |
|      12 | Big Swing Face           |
|      13 | Blue Night               |
|      14 | Eternity                 |
|      15 | Scandinavia              |
|      16 | Long Lost Suitcase       |
|      17 | Praise and Blame         |
|      18 | Along Came Jones         |
|      19 | All Night Wrong          |
|      20 | The Sixteen Men of Tain  |
+---------+--------------------------+

De REGEXP Operator

Hier leest u hoe u hetzelfde doet met de REGEXP operator:

SELECT 
  'Car' REGEXP '^C' AS 'Match',
  'Bar' REGEXP '^C' AS 'No Match';

Resultaat:

+-------+----------+
| Match | No Match |
+-------+----------+
|     1 |        0 |
+-------+----------+

En het databasevoorbeeld:

SELECT AlbumId, AlbumName
FROM Albums
WHERE AlbumName REGEXP '^Power';

Resultaat:

+---------+------------+
| AlbumId | AlbumName  |
+---------+------------+
|       1 | Powerslave |
|       2 | Powerage   |
+---------+------------+

U kunt ook NOT REGEXP . gebruiken om het tegenovergestelde resultaat te retourneren.

De RLIKE Operator

En hier gebruikt het RLIKE :

SELECT 
  'Car' RLIKE '^C' AS 'Match',
  'Bar' RLIKE '^C' AS 'No Match';

Resultaat:

+-------+----------+
| Match | No Match |
+-------+----------+
|     1 |        0 |
+-------+----------+

En het databasevoorbeeld:

SELECT AlbumId, AlbumName
FROM Albums
WHERE AlbumName RLIKE '^Power';

Resultaat:

+---------+------------+
| AlbumId | AlbumName  |
+---------+------------+
|       1 | Powerslave |
|       2 | Powerage   |
+---------+------------+

In dit geval heb ik gewoon REGEXP geruild voor RLIKE en liet de rest van de code met rust.

Je kunt ook NOT RLIKE . gebruiken om het tegenovergestelde resultaat te retourneren.

Meer REGEX-functies

MySQL bevat ook een paar andere regex-functies en -operators. Hieronder staan ​​er drie genoemd. Technisch gezien zou je ook de eerste twee kunnen gebruiken om te "detecteren" of een string overeenkomt met een regex-patroon (in dat geval zou dit artikel misschien de titel moeten hebben "5 manieren om te detecteren of een string overeenkomt met een reguliere expressie in MySQL" in plaats van alleen " 3 manieren…”).

Hoe dan ook, hier zijn nog drie regex-functies:

  • U kunt de REGEXP_INSTR() . gebruiken functie om de startindex van een subtekenreeks terug te geven die overeenkomt met het patroon van de reguliere expressie.
  • De REGEXP_SUBSTR() functie retourneert de subtekenreeks die overeenkomt met het gegeven patroon voor reguliere expressies.
  • En de REGEXP_REPLACE() functie vervangt de subtekenreeks binnen een tekenreeks die overeenkomt met het gegeven patroon voor reguliere expressies.

  1. Hoe beïnvloedt het zoekpad de resolutie van de ID en het huidige schema?

  2. PostgreSQL 13:laat slots je primaire niet doden

  3. Een belangrijke wijziging in Extended Events in SQL Server 2012

  4. SQL CASE:ken en vermijd 3 minder bekende problemen