MariaDB
 sql >> Baza danych >  >> RDS >> MariaDB

Jak REGEXP_REPLACE() działa w MariaDB

W MariaDB funkcja REGEXP_REPLACE() funkcja zastępuje wystąpienia podciągu w ciągu, który pasuje do podanego wzorca wyrażenia regularnego.

Zwracany jest cały ciąg wraz z zamiennikami.

Jeśli nie ma dopasowania (tj. ciąg wejściowy nie zawiera podciągu), cały ciąg jest zwracany bez zmian.

Składnia

Składnia wygląda tak:

REGEXP_REPLACE(subject, pattern, replace)

Gdzie subject jest ciągiem wejściowym, pattern jest wzorcem wyrażenia regularnego dla podciągu i replace jest ciągiem zastępczym.

Zwróć uwagę, że w chwili pisania tego tekstu wersja MariaDB funkcji REGEXP_REPLACE() akceptuje mniej argumentów niż REGEXP_REPLACE() MySQL funkcjonować. Wersja MySQL umożliwia podanie argumentów dla pozycji początkowej wyszukiwania, którego wystąpienia należy szukać, a także sposób uściślenia wyrażenia regularnego za pomocą typu dopasowania.

Przykład

Oto podstawowy przykład użycia REGEXP_REPLACE() w MariaDB:

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

Wynik:

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

W tym przypadku występuje dopasowanie, a podciąg jest zastępowany ciągiem zastępczym.

Wyrażenia regularne mogą mieć bardzo duże możliwości, a w tym przykładzie użyto bardzo prostego przykładu. Aby użyć REGEXP_REPLACE() skutecznie, będziesz musiał znać właściwy wzór, aby uzyskać pożądany efekt.

Wiele meczów

Oto przykład z wieloma dopasowaniami:

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

Wynik:

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

Brak dopasowania

Oto przykład, w którym nie ma dopasowania:

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

Wynik:

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

Brak dopasowania, więc oryginalny ciąg jest zwracany bez zmian.

Wrażliwość na wielkość liter

REGEXP_REPLACE() Funkcja jest zgodna z regułami rozróżniania wielkości liter efektywnego sortowania. Dopasowywanie jest wykonywane bez rozróżniania wielkości liter w przypadku sortowania bez rozróżniania wielkości liter oraz z rozróżnianiem wielkości liter w przypadku sortowania z rozróżnianiem wielkości liter i danych binarnych.

Oto przykład:

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";

Wynik:

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

Moje domyślne sortowanie nie uwzględnia wielkości liter. Pozostałe dwa ciągi zostały zmuszone do sortowania bez rozróżniania wielkości liter i sortowania z rozróżnianiem wielkości liter.

Zapewnienie BINARY string uwzględnia również wielkość liter (więcej o tym później).

Zastąp czułość wielkości liter

Wrażliwość na wielkość liter w sortowaniu można zmienić za pomocą (?i ) i (?-i ) Flagi PCRE.

Oto poprzedni przykład, ale tym razem przy użyciu (?-i) flaga na każdym wzorze, aby wymusić rozróżnianie wielkości liter:

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";

Wynik:

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

A tutaj używa (?i) flaga, aby wymusić niewrażliwość na wielkość liter:

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";

Wynik:

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

Ciągi binarne

Przekazywanie BINARY string wpływa również na rozróżnianie wielkości liter. Z BINARY ciągi znaków, znak z dużej litery jest inny niż jego odpowiednik z małej litery:

Przykład:

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

Wynik:

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

Oto, co się stanie, jeśli zmienimy przypadek:

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

Wynik:

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

Rozróżnianie wielkości liter w BINARY ciągi można również nadpisać za pomocą (?-i) i (?i) Flagi PCRE:

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

Wynik:

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

Argumenty zerowe

Przekazywanie null ponieważ dowolny argument daje wynik 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";

Wynik:

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

Niewłaściwa liczba argumentów

Przekazanie nieprawidłowej liczby argumentów lub brak argumentów skutkuje błędem:

SELECT REGEXP_REPLACE();

Wynik:

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

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak działa funkcja CONCAT_WS() w MariaDB

  2. Jak wydajny jest Twój węzeł ProxySQL?

  3. MariaDB wprowadza funkcję JSON_TABLE()

  4. Jak ADDDATE() działa w MariaDB

  5. Jak skonfigurować replikację asynchroniczną między klastrami MySQL Galera