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

Cách hoạt động của REGEXP trong MariaDB

Trong MariaDB, REGEXP toán tử được sử dụng để xác định xem một chuỗi có khớp với một biểu thức chính quy hay không.

Nếu chuỗi khớp với biểu thức chính quy được cung cấp, kết quả là 1 , nếu không thì nó là 0 .

Cú pháp

Cú pháp như sau:

expr REGEXP pat

Ở đâu expr là chuỗi đầu vào và pat là biểu thức chính quy mà bạn đang kiểm tra chuỗi.

Ví dụ

Dưới đây là các ví dụ về việc sử dụng REGEXP toán tử với các mẫu khác nhau.

Cụm từ Thông dụng Cơ bản

Hãy bắt đầu với ví dụ đơn giản nhất. Biểu thức chính quy đơn giản nhất mà chúng ta có thể sử dụng là một biểu thức không có ký tự đặc biệt trong đó. Ở đây, chúng tôi chỉ sử dụng một chuỗi. Nếu bất kỳ phần nào của chuỗi đầu vào khớp với chuỗi đó, nó sẽ trả về kết quả khớp.

SELECT 
  'Corn' REGEXP 'Corn' AS "Corn",
  'Acorn' REGEXP 'Corn' AS "Acorn",
  'Corner' REGEXP 'Corn' AS "Corner",
  'Cheese' REGEXP 'Corn' AS "Cheese";

Kết quả:

+------+-------+--------+--------+
| Corn | Acorn | Corner | Cheese |
+------+-------+--------+--------+
|    1 |     1 |      1 |      0 |
+------+-------+--------+--------+

Khớp phần đầu của một chuỗi

Trong ví dụ này, biểu thức chính quy chỉ định rằng chuỗi phải bắt đầu bằng Co .

SELECT 
  'Corn' REGEXP '^Co' AS "Corn",
  'Acorn' REGEXP '^Co' AS "Acorn",
  'Cheese' REGEXP '^Co' AS "Cheese";

Kết quả:

+------+-------+--------+
| Corn | Acorn | Cheese |
+------+-------+--------+
|    1 |     0 |      0 |
+------+-------+--------+

Khớp phần cuối của một chuỗi

Trong ví dụ này, biểu thức chính quy chỉ định rằng chuỗi phải kết thúc bằng rn .

SELECT 
  'Corn' REGEXP 'rn$' AS "Corn",
  'Acorn' REGEXP 'rn$' AS "Acorn",
  'Cheese' REGEXP 'rn$' AS "Cheese";

Kết quả:

+------+-------+--------+
| Corn | Acorn | Cheese |
+------+-------+--------+
|    1 |     1 |      0 |
+------+-------+--------+

Khớp bất kỳ ký tự nào

. ký tự khớp với bất kỳ ký tự nào.

SELECT 
  'Corn' REGEXP '.' AS "Corn",
  'Cheese' REGEXP '.' AS "Cheese",
  '' REGEXP '.' AS "";

Kết quả:

+------+--------+---+
| Corn | Cheese |   |
+------+--------+---+
|    1 |      1 | 0 |
+------+--------+---+

Ký tự này thường được sử dụng cùng với các ký tự khác để chỉ định các tiêu chí khác. Ví dụ:

SELECT 
  'Corn' REGEXP '^C.rn$' AS "Corn", 
  'Crn' REGEXP '^C.rn$' AS "Crn";

Kết quả:

+------+-----+
| Corn | Crn |
+------+-----+
|    1 |   0 |
+------+-----+

Ở đây chúng tôi chỉ định rằng chuỗi phải bắt đầu bằng C , rằng nó phải được theo sau bởi một ký tự (bất kỳ ký tự nào) và nó phải kết thúc bằng rn .

Lưu ý rằng ký tự này chỉ định một trường hợp duy nhất của ký tự. Nếu bạn muốn chỉ định nhiều trường hợp (ví dụ:ee thay vì chỉ e ), bạn sẽ cần thêm nhiều . ký tự.

SELECT 
  'Tweet' REGEXP '^Tw..t$' AS "Tweet", 
  'Tweat' REGEXP '^Tw..t$' AS "Tweat", 
  'Tweet' REGEXP '^Tw.t$' AS "Tweet", 
  'Twit' REGEXP '^Tw..t$' AS "Twit";

Kết quả:

+-------+-------+-------+------+
| Tweet | Tweat | Tweet | Twit |
+-------+-------+-------+------+
|     1 |     1 |     0 |    0 |
+-------+-------+-------+------+

Một cách khác để làm điều này là chỉ định số lần xuất hiện trong dấu ngoặc nhọn:

SELECT 
  'Tweet' REGEXP '^Tw.{2}t$' AS "Tweet", 
  'Tweat' REGEXP '^Tw.{2}t$' AS "Tweat", 
  'Tweet' REGEXP '^Tw.{1}t$' AS "Tweet", 
  'Twit' REGEXP '^Tw.{2}t$' AS "Twit";

Kết quả:

+-------+-------+-------+------+
| Tweet | Tweat | Tweet | Twit |
+-------+-------+-------+------+
|     1 |     1 |     0 |    0 |
+-------+-------+-------+------+

Tuy nhiên, nếu bạn biết ký tự mà bạn đang tìm kiếm, bạn có thể chỉ định ký tự đó (thay vì . ký tự), như được minh họa trong ví dụ sau.

Khớp với 0 hoặc nhiều trường hợp khác của một ký tự cụ thể

Chúng tôi có thể làm như sau để chỉ định không hoặc nhiều bản sao của e nhân vật:

SELECT 
  'Twet' REGEXP '^Twe*t$' AS "Twet",
  'Tweet' REGEXP '^Twe*t$' AS "Tweet",
  'Tweeet' REGEXP '^Twe*t$' AS "Tweeet",
  'Twt' REGEXP '^Twe*t$' AS "Twt",
  'Twit' REGEXP '^Twe*t$' AS "Twit",
  'Twiet' REGEXP '^Twe*t$' AS "Twiet",
  'Tweit' REGEXP '^Twe*t$' AS "Tweit";

Kết quả:

+------+-------+--------+-----+------+-------+-------+
| Twet | Tweet | Tweeet | Twt | Twit | Twiet | Tweit |
+------+-------+--------+-----+------+-------+-------+
|    1 |     1 |      1 |   1 |    0 |     0 |     0 |
+------+-------+--------+-----+------+-------+-------+

Bốn trận đầu tiên nhưng ba trận cuối cùng thì không.

Khớp một hoặc nhiều trường hợp của một ký tự cụ thể

Chúng tôi có thể sửa đổi ví dụ trước để chúng tôi chỉ nhận được kết quả phù hợp nếu một hoặc nhiều ký tự được tìm thấy (ví dụ trước đó trả về kết quả khớp nếu không hoặc nhiều hơn đã được tìm thấy). Để làm điều này, chúng tôi chỉ cần sử dụng + thay vì * :

SELECT 
  'Twet' REGEXP '^Twe+t$' AS "Twet",
  'Tweet' REGEXP '^Twe+t$' AS "Tweet",
  'Tweeet' REGEXP '^Twe+t$' AS "Tweeet",
  'Twt' REGEXP '^Twe+t$' AS "Twt",
  'Twit' REGEXP '^Twe+t$' AS "Twit",
  'Twiet' REGEXP '^Twe+t$' AS "Twiet",
  'Tweit' REGEXP '^Twe+t$' AS "Tweit";

Kết quả:

+------+-------+--------+-----+------+-------+-------+
| Twet | Tweet | Tweeet | Twt | Twit | Twiet | Tweit |
+------+-------+--------+-----+------+-------+-------+
|    1 |     1 |      1 |   0 |    0 |     0 |     0 |
+------+-------+--------+-----+------+-------+-------+

Trong trường hợp này, từ thứ tư trả về một kết quả khác với ví dụ trước.

Khớp số 0 hoặc một trường hợp của một nhân vật cụ thể

Chúng tôi có thể sửa đổi ví dụ trước để chúng tôi chỉ nhận được một kết quả khớp với số không hoặc một trong các ký tự mong muốn. Để làm điều này, chúng tôi sử dụng ? :

SELECT 
  'Twet' REGEXP '^Twe?t$' AS "Twet",
  'Tweet' REGEXP '^Twe?t$' AS "Tweet",
  'Tweeet' REGEXP '^Twe?t$' AS "Tweeet",
  'Twt' REGEXP '^Twe?t$' AS "Twt",
  'Twit' REGEXP '^Twe?t$' AS "Twit",
  'Twiet' REGEXP '^Twe?t$' AS "Twiet",
  'Tweit' REGEXP '^Twe?t$' AS "Tweit";

Kết quả:

+------+-------+--------+-----+------+-------+-------+
| Twet | Tweet | Tweeet | Twt | Twit | Twiet | Tweit |
+------+-------+--------+-----+------+-------+-------+
|    1 |     0 |      0 |   1 |    0 |     0 |     0 |
+------+-------+--------+-----+------+-------+-------+

Luân phiên

Bạn có thể sử dụng | ký tự để khớp với một hoặc một chuỗi ký tự khác:

SELECT 
  'Tweet' REGEXP 'Tw|et' AS "Tweet",
  'For Let' REGEXP 'Tw|et' AS "For Let",
  'Banana' REGEXP 'Tw|et' AS "Banana";

Kết quả:

+-------+---------+--------+
| Tweet | For Let | Banana |
+-------+---------+--------+
|     1 |       1 |      0 |
+-------+---------+--------+

Đây là một ví dụ khác mà tôi tìm kiếm toàn bộ từ:

SELECT 
  'Cat' REGEXP 'Cat|Dog' AS "Cat",
  'Dog' REGEXP 'Cat|Dog' AS "Dog",
  'Doggone' REGEXP 'Cat|Dog' AS "Doggone",
  'Banana' REGEXP 'Cat|Dog' AS "Banana";

Kết quả:

+-----+-----+---------+--------+
| Cat | Dog | Doggone | Banana |
+-----+-----+---------+--------+
|   1 |   1 |       1 |      0 |
+-----+-----+---------+--------+

Chúng tôi vẫn nhận được một kết quả phù hợp ngay cả khi biểu thức chính quy của chúng tôi chỉ khớp với một phần của chuỗi.

So khớp 0 hoặc nhiều bản sao của một trình tự

Bạn có thể sử dụng dấu ngoặc cùng với dấu hoa thị ()* để chỉ định không hoặc nhiều trường hợp của một chuỗi:

SELECT 
  'Banana' REGEXP '(an)*' AS "Banana",
  'Land' REGEXP '(an)*' AS "Land",
  'Cheese' REGEXP '(an)*' AS "Cheese";

Kết quả:

+--------+------+--------+
| Banana | Land | Cheese |
+--------+------+--------+
|      1 |    1 |      1 |
+--------+------+--------+

Một ví dụ khác:

SELECT 
  'Banana' REGEXP '^B(an)*d$' AS "Banana",
  'Band' REGEXP '^B(an)*d$' AS "Band",
  'Bald' REGEXP '^B(an)*d$' AS "Bald",
  'Bad' REGEXP '^B(an)*d$' AS "Bad";

Kết quả:

+--------+------+------+-----+
| Banana | Band | Bald | Bad |
+--------+------+------+-----+
|      0 |    1 |    0 |   0 |
+--------+------+------+-----+

Lặp lại

Như đã thấy trong ví dụ trước, bạn có thể sử dụng dấu ngoặc nhọn để chỉ định sự lặp lại. Ký hiệu này cung cấp cách viết chung hơn về biểu thức chính quy so với một số ví dụ trước đó:

SELECT 
  'Tweeet' REGEXP 'e{3}' AS "Tweeet",
  'Tweet' REGEXP 'e{3}' AS "Tweet";

Kết quả:

+--------+-------+
| Tweeet | Tweet |
+--------+-------+
|      1 |     0 |
+--------+-------+

Phạm vi

Bạn có thể sử dụng ký tự gạch nối để chỉ định một phạm vi. Dưới đây là một ví dụ chỉ định một dải số:

SELECT 
  'Tweet 123' REGEXP '[0-9]' AS "Tweet 123",
  'Tweet ABC' REGEXP '[0-9]' AS "Tweet ABC";

Kết quả:

+--------+-------+
| Tweeet | Tweet |
+--------+-------+
|      1 |     0 |
+--------+-------+

Và ví dụ sau chỉ định một loạt các chữ cái:

SELECT 
  'Tweet 123' REGEXP '[A-Z]' AS "Tweet 123",
  'ABC' REGEXP '[A-Z]' AS "ABC",
  '123' REGEXP '[A-Z]' AS "123";

Kết quả:

+-----------+-----+-----+
| Tweet 123 | ABC | 123 |
+-----------+-----+-----+
|         1 |   1 |   0 |
+-----------+-----+-----+

Dưới đây là những gì sẽ xảy ra nếu chúng tôi giới hạn phạm vi số:

SELECT 
  '123' REGEXP '[1-3]' AS "123",
  '012' REGEXP '[1-3]' AS "012",
  '045' REGEXP '[1-3]' AS "045";

Kết quả:

+-----+-----+-----+
| 123 | 012 | 045 |
+-----+-----+-----+
|   1 |   1 |   0 |
+-----+-----+-----+

Không trong phạm vi

Chúng ta có thể sử dụng ^ để sửa đổi ví dụ trước đó để loại trừ phạm vi ký tự đã chỉ định:

SELECT 
  '123' REGEXP '[^1-3]' AS "123",
  '012' REGEXP '[^1-3]' AS "012",
  '045' REGEXP '[^1-3]' AS "045";

Kết quả:

+-----+-----+-----+
| 123 | 012 | 045 |
+-----+-----+-----+
|   0 |   1 |   1 |
+-----+-----+-----+

Trong trường hợp này, chúng tôi nhận được kết quả ngược lại với ví dụ trước.

Giá trị rỗng

Nếu biểu thức hoặc mẫu là null , kết quả là null :

SELECT 
  null REGEXP 'Corn' AS "Corn",
  'Acorn' REGEXP null AS "Acorn",
  null REGEXP null AS "Corner";

Kết quả:

+------+-------+--------+
| Corn | Acorn | Corner |
+------+-------+--------+
| NULL |  NULL |   NULL |
+------+-------+--------+

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cách POSITION () hoạt động trong MariaDB

  2. Kết hợp sức mạnh của SQL và các câu lệnh thủ tục với Chế độ tương thích Oracle của MariaDB

  3. So sánh MariaDB Enterprise Backup với ClusterControl Backup Management

  4. Cách STR_TO_DATE () hoạt động trong MariaDB

  5. Cảm ơn bạn, Amazon, đã truyền cảm hứng cho chúng tôi để cung cấp một DBaaS tốt hơn:SkySQL