MariaDB
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> MariaDB

Cách REGEXP_REPLACE () hoạt động trong MariaDB

Trong MariaDB, REGEXP_REPLACE() hàm thay thế các lần xuất hiện của chuỗi con trong một chuỗi khớp với mẫu biểu thức chính quy đã cho.

Toàn bộ chuỗi được trả về cùng với các chuỗi thay thế.

Nếu không có kết quả khớp nào (tức là chuỗi đầu vào không chứa chuỗi con), thì toàn bộ chuỗi được trả về không thay đổi.

Cú pháp

Cú pháp như sau:

REGEXP_REPLACE(subject, pattern, replace)

Ở đâu subject là chuỗi đầu vào, pattern là mẫu biểu thức chính quy cho chuỗi con và replace là chuỗi thay thế.

Lưu ý rằng, tại thời điểm viết bài, phiên bản REGEXP_REPLACE() của MariaDB chấp nhận ít đối số hơn REGEXP_REPLACE() của MySQL hàm số. Phiên bản của MySQL cho phép bạn cung cấp các đối số cho vị trí bắt đầu của tìm kiếm, vị trí xuất hiện để tìm kiếm, cũng như một cách để tinh chỉnh biểu thức chính quy với loại đối sánh.

Ví dụ

Đây là ví dụ cơ bản về việc sử dụng REGEXP_REPLACE() trong MariaDB:

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

Kết quả:

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

Trong trường hợp này, có một kết quả khớp và chuỗi con được thay thế bằng chuỗi thay thế.

Biểu thức chính quy có thể rất mạnh và ví dụ này sử dụng một ví dụ rất đơn giản. Để sử dụng REGEXP_REPLACE() một cách hiệu quả, bạn sẽ cần biết mẫu chính xác để sử dụng cho kết quả mong muốn.

Nhiều Kết hợp

Dưới đây là một ví dụ với nhiều kết quả phù hợp:

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

Kết quả:

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

Không phù hợp

Dưới đây là một ví dụ mà không có kết quả phù hợp nào:

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

Kết quả:

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

Không có kết quả khớp nào, vì vậy chuỗi gốc được trả về không thay đổi.

Phân biệt chữ hoa chữ thường

REGEXP_REPLACE() hàm tuân theo các quy tắc phân biệt chữ hoa chữ thường của phép đối chiếu hiệu quả. Đối sánh được thực hiện phân biệt chữ hoa chữ thường đối với các đối chiếu phân biệt chữ hoa chữ thường và phân biệt chữ hoa chữ thường đối với các đối chiếu phân biệt chữ hoa chữ thường và đối với dữ liệu nhị phân.

Đây là một ví dụ:

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

Kết quả:

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

Đối chiếu mặc định của tôi là không phân biệt chữ hoa chữ thường. Hai chuỗi còn lại buộc phải đối chiếu phân biệt chữ hoa chữ thường và phân biệt chữ hoa chữ thường.

Cung cấp BINARY chuỗi cũng phân biệt chữ hoa chữ thường (sẽ nói thêm về điều này sau).

Ghi đè phân biệt chữ hoa chữ thường

Độ nhạy chữ hoa và chữ thường đối chiếu có thể được ghi đè bằng cách sử dụng (?i ) và (?-i ) Cờ PCRE.

Đây là ví dụ trước, nhưng lần này sử dụng (?-i) gắn cờ trên mỗi mẫu để bắt buộc phân biệt chữ hoa chữ thường:

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

Kết quả:

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

Và ở đây nó đang sử dụng (?i) cờ để buộc phân biệt chữ hoa chữ thường:

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

Kết quả:

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

Chuỗi nhị phân

Chuyển BINARY chuỗi cũng ảnh hưởng đến độ phân biệt chữ hoa và chữ thường. Với BINARY chuỗi, một ký tự viết hoa khác với ký tự viết thường của nó:

Ví dụ:

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

Kết quả:

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

Đây là những gì sẽ xảy ra nếu chúng tôi thay đổi trường hợp:

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

Kết quả:

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

Phân biệt chữ hoa chữ thường trên BINARY chuỗi cũng có thể được ghi đè bằng (?-i)(?i) Cờ PCRE:

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

Kết quả:

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

Đối số rỗng

Chuyển null vì bất kỳ đối số nào dẫn đến 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";

Kết quả:

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

Số lượng đối số sai

Truyền sai số đối số hoặc không có đối số, dẫn đến lỗi:

SELECT REGEXP_REPLACE();

Kết quả:

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. Triển khai MySQL Galera Cluster 4.0 trên Amazon AWS EC2

  2. Cách kết nối các chương trình C ++ với MariaDB

  3. Cách TRIM () hoạt động trong MariaDB

  4. 8 cách để thêm một giờ vào một ngày trong MariaDB

  5. Cách UNCOMPRESSED_LENGTH () hoạt động trong MariaDB