sql >> Databáze >  >> RDS >> MariaDB

Jak funguje REGEXP_REPLACE() v MariaDB

V MariaDB, REGEXP_REPLACE() funkce nahradí výskyty podřetězce v řetězci, který odpovídá danému vzoru regulárního výrazu.

Celý řetězec se vrátí spolu s náhradami.

Pokud neexistuje žádná shoda (tj. vstupní řetězec neobsahuje podřetězec), vrátí se celý řetězec beze změny.

Syntaxe

Syntaxe vypadá takto:

REGEXP_REPLACE(subject, pattern, replace)

Kde subject je vstupní řetězec, pattern je vzor regulárního výrazu pro podřetězec a replace je náhradní řetězec.

Všimněte si, že v době psaní tohoto článku byla MariaDB verze REGEXP_REPLACE() přijímá méně argumentů než REGEXP_REPLACE() MySQL funkce. Verze MySQL vám umožňuje poskytnout argumenty pro počáteční pozici vyhledávání, který výskyt hledat, a také způsob, jak upřesnit regulární výraz pomocí typu shody.

Příklad

Zde je základní příklad použití REGEXP_REPLACE() v MariaDB:

SELECT REGEXP_REPLACE('Cats and dogs', 'd.g', 'bird');

Výsledek:

+------------------------------------------------+
| REGEXP_REPLACE('Cats and dogs', 'd.g', 'bird') |
+------------------------------------------------+
| Cats and birds                                 |
+------------------------------------------------+

V tomto případě existuje shoda a podřetězec je nahrazen náhradním řetězcem.

Regulární výrazy mohou být velmi výkonné a tento příklad používá velmi jednoduchý příklad. Chcete-li použít REGEXP_REPLACE() efektivně, budete potřebovat znát správný vzor, ​​který použijete pro požadovaný výsledek.

Více shod

Zde je příklad s více shodami:

SELECT REGEXP_REPLACE('My dog likes other dogs', 'd.g', 'bird');

Výsledek:

+----------------------------------------------------------+
| REGEXP_REPLACE('My dog likes other dogs', 'd.g', 'bird') |
+----------------------------------------------------------+
| My bird likes other birds                                |
+----------------------------------------------------------+

Žádná shoda

Zde je příklad, kdy neexistuje žádná shoda:

SELECT REGEXP_REPLACE('Cats and dogs', 't.g', 'bird');

Výsledek:

+------------------------------------------------+
| REGEXP_REPLACE('Cats and dogs', 't.g', 'bird') |
+------------------------------------------------+
| Cats and dogs                                  |
+------------------------------------------------+

Neexistuje žádná shoda, takže původní řetězec je vrácen beze změny.

Rozlišovat malá a velká písmena

REGEXP_REPLACE() funkce se řídí pravidly rozlišování malých a velkých písmen efektivního řazení. Párování se provádí bez rozlišení malých a velkých písmen u porovnávání bez rozlišení malých a velkých písmen a u porovnávání rozlišujících malá a velká písmena a u binárních dat.

Zde je příklad:

SELECT 
    REGEXP_REPLACE('My Cats', 'c.t', 'dog') AS "My Default",
    REGEXP_REPLACE(_latin7'My Cats' COLLATE latin7_general_ci, 'c.t', 'dog') AS "Case Insensitive",
    REGEXP_REPLACE(_latin7'My Cats' COLLATE latin7_general_cs, 'c.t', 'dog') AS "Case Sensitive";

Výsledek:

+------------+------------------+----------------+
| My Default | Case Insensitive | Case Sensitive |
+------------+------------------+----------------+
| My dogs    | My dogs          | My Cats        |
+------------+------------------+----------------+

Moje výchozí řazení nerozlišuje malá a velká písmena. Zbývající dva řetězce byly nuceny používat řazení bez rozlišení malých a velkých písmen, respektive řazení rozlišující malá a velká písmena.

Poskytování BINARY řetězec také rozlišuje velká a malá písmena (více o tom později).

Přepsat rozlišování malých a velkých písmen

Citlivost řazení malých a velkých písmen lze potlačit pomocí (?i ) a (?-i ) Příznaky PCRE.

Zde je předchozí příklad, ale tentokrát s použitím (?-i) příznak na každém vzoru pro vynucení rozlišení velkých a malých písmen:

SELECT 
    REGEXP_REPLACE('My Cats', '(?-i)c.t', 'dog') AS "My Default",
    REGEXP_REPLACE(_latin7'My Cats' COLLATE latin7_general_ci, '(?-i)c.t', 'dog') AS "Case Insensitive",
    REGEXP_REPLACE(_latin7'My Cats' COLLATE latin7_general_cs, '(?-i)c.t', 'dog') AS "Case Sensitive";

Výsledek:

+------------+------------------+----------------+
| My Default | Case Insensitive | Case Sensitive |
+------------+------------------+----------------+
| My Cats    | My Cats          | My Cats        |
+------------+------------------+----------------+

A zde je to pomocí (?i) příznak pro vynucení rozlišování malých a velkých písmen:

SELECT 
    REGEXP_REPLACE('My Cats', '(?i)c.t', 'dog') AS "My Default",
    REGEXP_REPLACE(_latin7'My Cats' COLLATE latin7_general_ci, '(?i)c.t', 'dog') AS "Case Insensitive",
    REGEXP_REPLACE(_latin7'My Cats' COLLATE latin7_general_cs, '(?i)c.t', 'dog') AS "Case Sensitive";

Výsledek:

+------------+------------------+----------------+
| My Default | Case Insensitive | Case Sensitive |
+------------+------------------+----------------+
| My dogs    | My dogs          | My dogs        |
+------------+------------------+----------------+

Binární řetězce

Předávání BINARY řetězec také ovlivňuje citlivost. S BINARY řetězce, velký znak se liší od malého protějšku:

Příklad:

SELECT 
    REGEXP_REPLACE('My Cats', 'c.t', 'dog') AS "Character",
    REGEXP_REPLACE(BINARY 'My Cats', 'c.t', 'dog') AS "Binary";

Výsledek:

+-----------+---------+
| Character | Binary  |
+-----------+---------+
| My dogs   | My Cats |
+-----------+---------+

Pokud změníme velikost písmen, stane se toto:

SELECT 
    REGEXP_REPLACE('My Cats', 'C.t', 'dog') AS "Character",
    REGEXP_REPLACE(BINARY 'My Cats', 'C.t', 'dog') AS "Binary";

Výsledek:

+-----------+---------+
| Character | Binary  |
+-----------+---------+
| My dogs   | My dogs |
+-----------+---------+

Rozlišování malých a velkých písmen na BINARY řetězce lze také přepsat pomocí (?-i) a (?i) Příznaky PCRE:

SELECT 
    REGEXP_REPLACE('My Cats', '(?-i)c.t', 'dog') AS "Character",
    REGEXP_REPLACE(BINARY 'My Cats', '(?-i)c.t', 'dog') AS "Binary";

Výsledek:

+-----------+---------+
| Character | Binary  |
+-----------+---------+
| My Cats   | My Cats |
+-----------+---------+

Nulové argumenty

Předávání null protože jakýkoli argument má za následek null :

SELECT 
    REGEXP_REPLACE(null, 'c.t', 'dog') AS "1",
    REGEXP_REPLACE('Cat', null, 'dog') AS "2",
    REGEXP_REPLACE('Cat', 'c.t', null) AS "3",
    REGEXP_REPLACE(null, null, null) AS "4";

Výsledek:

+------+------+------+------+
| 1    | 2    | 3    | 4    |
+------+------+------+------+
| NULL | NULL | NULL | NULL |
+------+------+------+------+

Špatný počet argumentů

Předání nesprávného počtu argumentů nebo žádné argumenty vede k chybě:

SELECT REGEXP_REPLACE();

Výsledek:

ERROR 1582 (42000): Incorrect parameter count in the call to native function 'REGEXP_REPLACE'

  1. SQL IN vs SQL EXISTUJE

  2. Jak přidám indexy do tabulek MySQL?

  3. Jak provést vnitřní spojení na čísle řádku na serveru SQL

  4. Sledování aktualizací synchronních statistik