MySQL - 正則表示式



MySQL 支援各種型別的模式匹配操作,以從龐大的資料庫表中檢索過濾後的結果集。在前面的章節中,我們已經學習了用於模式匹配的 LIKE 運算子。在本章中,我們將看到另一個基於正則表示式的模式匹配操作。

MySQL 正則表示式

正則表示式被寬泛地定義為表示輸入文字中模式的一系列字元。它用於使用某些模式查詢或替換文字字串;此模式可以是單個字元、多個字元或單詞等。

MySQL 使用 Unicode 國際元件 (ICU) 實現正則表示式支援,該元件提供完整的 Unicode 支援並且是多位元組安全的。

在 MySQL 中,它是一種強大的方式,可以在資料庫中執行復雜的搜尋操作以檢索所需內容。與 LIKE 運算子不同,正則表示式在搜尋模式(如 % 和 _)上不受限制,因為它們使用其他幾個元字元來擴充套件模式匹配期間的靈活性與控制。這是使用 **REGEXP** 運算子執行的。

語法

以下是 MySQL 中 REGEXP 運算子的基本語法:

expression REGEXP pattern

與 REGEXP 一起使用的模式

以下是可與 **REGEXP** 運算子一起使用的模式表。

模式 模式匹配的內容
^ 字串開頭
$ 字串結尾
. 任何單個字元
[...] 方括號之間列出的任何字元
[^...] 方括號之間未列出的任何字元
p1|p2|p3 交替;匹配模式 p1、p2 或 p3 中的任何一個
* 前一個元素的零個或多個例項
+ 前一個元素的一個或多個例項
{n} 前一個元素的 n 個例項
{m,n} 前一個元素的 m 到 n 個例項
[A-Z] 任何大寫字母
[a-z] 任何小寫字母
[0-9] 任何數字(從 0 到 9)
[[:<:]] 單詞開頭
[[:>:]] 單詞結尾
[:class:] 字元類,即使用 [:alpha:] 匹配字母表中的字母

示例

以下示例演示了上表中提到的某些模式以及 REGEXP 運算子的使用。為此,我們首先建立一個數據庫表來執行搜尋。

假設我們使用以下查詢建立一個名為 **CUSTOMERS** 的表:

CREATE TABLE CUSTOMERS (
   ID INT AUTO_INCREMENT,
   NAME VARCHAR(20) NOT NULL,
   AGE INT NOT NULL,
   ADDRESS CHAR (25),
   SALARY DECIMAL (18, 2),
   PRIMARY KEY (ID)
);

現在,使用下面給出的 INSERT 語句向其中插入一些值:

INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY) VALUES 
(1, 'Ramesh', 32, 'Ahmedabad', 2000.00 ),
(2, 'Khilan', 25, 'Delhi', 1500.00 ),
(3, 'Kaushik', 23, 'Kota', 2000.00 ),
(4, 'Chaitali', 25, 'Mumbai', 6500.00 ),
(5, 'Hardik', 27, 'Bhopal', 8500.00 ),
(6, 'Komal', 22, 'Hyderabad', 4500.00 ),
(7, 'Muffy', 24, 'Indore', 10000.00 );

執行以下查詢以顯示上面建立的表中存在的所有記錄:

SELECT * FROM CUSTOMERS;

以下是 CUSTOMERS 表中存在的記錄:

ID NAME AGE ADDRESS SALARY
1 Ramesh 32 Ahmedabad 2000.00
2 Khilan 25 Delhi 1500.00
3 Kaushik 23 Kota 2000.00
4 Chaitali 25 Mumbai 6500.00
5 Hardik 27 Bhopal 8500.00
6 Komal 22 Hyderabad 4500.00
7 Muffy 24 Indore 10000.00

使用模式的 REGEXP:

現在,我們在 CUSTOMERS 表中查詢名稱以 **'k'** 開頭的所有記錄:

SELECT * FROM CUSTOMERS WHERE NAME REGEXP '^k';

執行上面的查詢將產生以下輸出:

ID NAME AGE ADDRESS SALARY
2 Khilan 25 Delhi 1500.00
3 Kaushik 23 Kota 2000.00
6 Komal 22 Hyderabad 4500.00

以下查詢檢索 CUSTOMERS 表中名稱以 **'sh'** 結尾的所有記錄:

SELECT * FROM CUSTOMERS WHERE NAME REGEXP 'sh$';

執行上面的查詢將產生以下輸出:

ID NAME AGE ADDRESS SALARY
1 Ramesh 32 Ahmedabad 2000.00

在這裡,我們檢索名稱包含 **'sh'** 的所有記錄:

SELECT * FROM CUSTOMERS WHERE NAME REGEXP 'sh';

如我們所見,只有兩個名稱包含“sh”。

ID NAME AGE ADDRESS SALARY
1 Ramesh 32 Ahmedabad 2000.00
3 Kaushik 23 Kota 2000.00

在以下查詢中,我們查詢 CUSTOMERS 表中所有以母音開頭並以 **'ol'** 結尾的名稱:

SELECT * FROM CUSTOMERS WHERE NAME REGEXP '^[aeiou].*ol$';

它返回了一個空集,因為 CUSTOMERS 表中沒有以母音開頭並以“ol”結尾的名稱。

Empty set (0.00 sec)

以下查詢查詢 CUSTOMERS 表中名稱以子音開頭的所有名稱:

SELECT * FROM CUSTOMERS WHERE NAME REGEXP '^[^aeiou]';

執行上面的查詢將產生以下輸出:

ID NAME AGE ADDRESS SALARY
1 Ramesh 32 Ahmedabad 2000.00
2 Khilan 25 Delhi 1500.00
3 Kaushik 23 Kota 2000.00
4 Chaitali 25 Mumbai 6500.00
5 Hardik 27 Bhopal 8500.00
6 Komal 22 Hyderabad 4500.00
7 Muffy 24 Indore 10000.00

正則表示式函式和運算子

以下是正則表示式的函式和運算子表。

序號 函式或運算子
1

NOT REGEXP

REGEXP 的否定

2

REGEXP

檢查字串是否與正則表示式匹配

3

REGEXP_INSTR()

返回與正則表示式匹配的子字串的起始索引

4

REGEXP_LIKE()

返回字串是否與正則表示式匹配

5

REGEXP_REPLACE()

替換與正則表示式匹配的子字串

6

REGEXP_SUBSTR()

返回與正則表示式匹配的子字串

7

RLIKE

檢查字串是否與正則表示式匹配

廣告