詳解 SQL 正則表達式 (REGEXP)
正則表達式(Regular Expression, 簡稱 Regex 或 RegExp)是用于匹配字符串模式的強大工具。在 SQL 中,正則表達式主要用于字符串的檢索和匹配。通過正則表達式,我們可以實現(xiàn)更復(fù)雜和靈活的查詢,特別是在數(shù)據(jù)清洗和復(fù)雜數(shù)據(jù)查詢場景中。
本文將詳細講解 SQL 中正則表達式的使用,包括基本的語法規(guī)則、常見匹配模式,并結(jié)合 MySQL 的具體實現(xiàn)進行代碼示例說明。
1. 正則表達式簡介
正則表達式是一種字符串匹配的模式,可以用來查找、替換、驗證字符串。雖然每個數(shù)據(jù)庫對正則表達式的支持程度不同,但 MySQL 提供了相對完善的正則表達式支持,使用 REGEXP 或 RLIKE 關(guān)鍵字來實現(xiàn)正則匹配。
2. MySQL 中的正則表達式函數(shù)
MySQL 中常用的正則表達式相關(guān)函數(shù)有兩個:
- REGEXP:用于匹配正則表達式,等同于 RLIKE。
- NOT REGEXP:匹配不符合正則表達式的字符串。
基本語法:
SELECT column_name
FROM table_name
WHERE column_name REGEXP 'pattern';
- pattern:要匹配的正則表達式模式。
- REGEXP 會返回布爾值,匹配返回 1,不匹配返回 0。
例如,查詢名字中包含字母 "a" 的數(shù)據(jù):
SELECT name
FROM users
WHERE name REGEXP 'a';
3. 常用正則表達式語法
(1) 基本字符匹配
- **.**:匹配任意單個字符。
- **[abc]**:匹配集合中的任意一個字符。
- **[^abc]**:匹配不在集合中的任意字符。
- **^**:匹配字符串的開頭。
- **$**:匹配字符串的結(jié)尾。
(2) 字符集匹配
- **[0-9]**:匹配任意數(shù)字。
- **[a-z]**:匹配任意小寫字母。
- **[A-Z]**:匹配任意大寫字母。
(3) 字符類匹配
- **\d**:匹配任意數(shù)字,等同于 [0-9]。
- **\w**:匹配字母、數(shù)字和下劃線,等同于 [a-zA-Z0-9_]。
- **\s**:匹配空白字符(空格、制表符等)。
(4) 邊界匹配
- **^**:匹配字符串開頭。
- **$**:匹配字符串結(jié)尾。
(5) 重復(fù)匹配
- *****:匹配前面的字符 0 次或多次。
- **+**:匹配前面的字符 1 次或多次。
- **?**:匹配前面的字符 0 次或 1 次。
- **{n}**:匹配前面的字符恰好 n 次。
- **{n,}**:匹配前面的字符至少 n 次。
- **{n,m}**:匹配前面的字符至少 n 次,但不超過 m 次。
4. 示例講解
(1) 基本字符匹配
查找所有名字中包含字符 "a" 的用戶:
SELECT name
FROM users
WHERE name REGEXP 'a';
解釋:正則表達式 a 表示匹配包含 "a" 的所有名字。
(2) 字符集匹配
查找名字中包含任意數(shù)字的用戶:
SELECT name
FROM users
WHERE name REGEXP '[0-9]';
解釋:[0-9] 表示匹配名字中含有數(shù)字的記錄。
(3) 邊界匹配
查找以字母 "A" 開頭的名字:
SELECT name
FROM users
WHERE name REGEXP '^A';
解釋:^A 表示匹配以 "A" 開頭的名字。
(4) 重復(fù)匹配
查找名字中含有至少兩個連續(xù) "o" 字母的用戶:
SELECT name
FROM users
WHERE name REGEXP 'o{2,}';
解釋:o{2,} 表示匹配包含至少兩個連續(xù) "o" 字符的名字。
5. 實戰(zhàn)示例:使用正則表達式進行數(shù)據(jù)篩選
示例 1:匹配電子郵件地址
要從用戶表中查找所有合法的電子郵件地址,可以使用如下的正則表達式:
SELECT email
FROM users
WHERE email REGEXP '^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$';
解釋:此正則表達式匹配標準的電子郵件格式,確保郵箱地址以字母或數(shù)字開頭,中間包含 "@",最后是域名。
示例 2:匹配手機號(中國大陸)
篩選出格式為 11 位的手機號:
SELECT phone
FROM users
WHERE phone REGEXP '^1[3-9][0-9]{9}$';
解釋:正則表達式 ^1[3-9][0-9]{9}$ 用于匹配中國大陸的手機號,1 開頭,第二位為 3-9 之間的數(shù)字,且總長度為 11 位。
示例 3:匹配身份證號
要篩選出有效的 18 位身份證號碼:
SELECT id_card
FROM users
WHERE id_card REGEXP '^[1-9][0-9]{5}(18|19|20)[0-9]{2}(0[1-9]|1[0-2])(0[1-9]|[12][0-9]|3[01])[0-9]{3}[0-9Xx]$';
解釋:該正則表達式確保身份證號是 18 位,且日期部分為合法日期。
結(jié)語
正則表達式是 SQL 中非常強大的工具,尤其在字符串匹配和數(shù)據(jù)清洗過程中能夠發(fā)揮極大的作用。通過本文的介紹,你應(yīng)該能夠掌握 MySQL 中正則表達式的基本用法,并能靈活應(yīng)用到實際項目中。正則表達式的學(xué)習(xí)是一個循序漸進的過程,建議多實踐和嘗試,以便熟練掌握其強大之處。