MySQL - 正則表達式

Hello, 抱負勃勃的數據庫愛好者!今天,我們將進入MySQL正則表達式的迷人世界。別擔心如果您之前從未編過程 - 我們將從基礎開始,逐步學習。在本教程結束時,您將能像專業人士一樣使用正則表達式!

MySQL - Regular Expressions

正則表達式是什麼?

在我們深入MySQL的具體內容之前,讓我們先了解什麼是正則表達式(regex)。想像您正在文本的干草堆中尋找一個特定的模式。這就是regex派上用場的地方!它就像一個超強的搜索工具,能夠在字符串中找到複雜的模式。

MySQL正則表達式

在MySQL中,我們使用REGEXP操作符來使用正則表達式。它與LIKE操作符相似,但更為強大。

基本語法

這裡是基本語法:

SELECT column_name(s)
FROM table_name
WHERE column_name REGEXP 'pattern';

讓我們看一些例子:

SELECT * FROM employees WHERE last_name REGEXP 'son';

這個查詢會找到所有姓氏中包含'son'的員工,如Johnson、Wilson或Sonny。

大小寫敏感性

默認情況下,MySQL的正則表達式是不區分大小寫的。如果您想進行區分大小寫的匹配,請使用BINARY關鍵字:

SELECT * FROM employees WHERE last_name REGEXP BINARY 'Smith';

這將匹配'Smith',但不會匹配'smith'或'SMITH'。

在REGEXP中使用的模式

現在,讓我們探討一些與REGEXP一起使用的常見模式。我喜歡將這些模式視為regex的"秘密代碼" - 一旦您知道了它們,您幾乎可以找到任何東西!

^ (插入符) - 字符串開頭

插入符匹配字符串開頭的模式。

SELECT * FROM products WHERE product_name REGEXP '^Apple';

這會找到所有名稱以'Apple'開頭的產品,如'Apple iPhone'或'Apple MacBook'。

$ (美元符) - 字符串結尾

美元符匹配字符串結尾的模式。

SELECT * FROM products WHERE product_name REGEXP 'Pro$';

這會找到以'Pro'結尾的產品,如'MacBook Pro'或'iPad Pro'。

. (點) - 任何單個字符

點匹配任何單個字符,除了換行符。

SELECT * FROM words WHERE word REGEXP 'c.t';

這會匹配如'cat'、'cut'甚至'c@t'的單詞!

* (星號) - 零個或多個出現

星號匹配前一个字符的零個或多個出現。

SELECT * FROM emails WHERE email REGEXP 'info.*@example.com';

這會匹配如'[email protected]'、'[email protected]'甚至'[email protected]'的電子郵件。

+ (加號) - 一個或多個出現

與*相似,但至少要求有一個出現。

SELECT * FROM products WHERE product_name REGEXP 'iPad ?Pro+';

這會匹配'iPad Pro'、'iPad Pro'、'iPad Pro'等。

? (問號) - 零個或一個出現

問號使前一个字符變為可選。

SELECT * FROM words WHERE word REGEXP 'colou?r';

這會匹配'color'和'colour'。

[] (方括號) - 字符集

方括號定義了一個要匹配的字符集。

SELECT * FROM employees WHERE last_name REGEXP '[AEIOU]';

這會找到包含任何元音的姓氏。

[^] (否定字符集)

在方括號內添加插入符來否定集合。

SELECT * FROM products WHERE product_name REGEXP '[^0-9]';

這會找到不包含任何數字的產品名稱。

| (管道符) - 交替

管道符 acts like an OR 運算符。

SELECT * FROM animals WHERE species REGEXP 'cat|dog';

這會找到我們動物表中的所有貓和狗。

正則表達式函數和操作符

MySQL提供了多個用於處理正則表達式的函數和操作符。讓我們來探討它們:

函數/操作符 描述
REGEXP 將字符串與正則表達式進行匹配
REGEXP_LIKE() 如果字符串匹配正則表達式模式,則返回1,否則返回0
REGEXP_INSTR() 返回正則表達式第一次匹配的起始索引
REGEXP_REPLACE() 替换匹配正則表達式的子字符串
REGEXP_SUBSTR() 返回匹配正則表達式的子字符串

讓我們看一些例子:

REGEXP_LIKE()

SELECT * FROM products WHERE REGEXP_LIKE(product_name, '^iPhone');

這會找到所有名稱以'iPhone'開頭的產品。

REGEXP_INSTR()

SELECT email, REGEXP_INSTR(email, '@') AS at_position
FROM users;

這會返回每個電子郵件地址中'@'符號的位置。

REGEXP_REPLACE()

SELECT REGEXP_REPLACE('Hello, World!', '[aeiou]', '*') AS vowels_replaced;

這會將所有元音替換為星號,返回'Hll, W*rld!'。

REGEXP_SUBSTR()

SELECT REGEXP_SUBSTR('[email protected]', '[^@]+') AS username;

這會提取電子郵件地址的用戶名部分。

結論

恭喜您!您剛剛邁出了進入MySQL正則表達式強大世界的第一步。記住,熟能生巧。嘗試創建有自己的正則表達式模式,並嘗試不同的組合。

隨著您繼續前行,您會發現regex就像您數據庫工具包中的瑞士軍刀。它可能起初看起來有點棘手,但一旦您掌握了它,您會奇怪自己以前是如何沒有它來管理數據的!

快樂編程,願您的查詢總是返回您尋找的結果!

Credits: Image by storyset