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