MySQL 中正則表達式通過 REGEXP
或 RLIKE
操作符實現(兩者等價),用于在 WHERE
子句中進行復雜的字符串模式匹配。以下是核心用法和示例:
一、基礎語法
SELECT column_name
FROM table_name
WHERE column_name REGEXP 'pattern';
-- 或
WHERE column_name RLIKE 'pattern';
二、常用元字符
元字符 | 說明 | 示例 |
---|---|---|
^ | 匹配開頭 | '^a' → 以 “a” 開頭 |
$ | 匹配結尾 | 'z$' → 以 “z” 結尾 |
. | 匹配任意單個字符 | 'a.c' → “abc”, “axc” |
[...] | 字符集合 | '[aeiou]' → 匹配任一元音 |
[^...] | 排除字符集合 | '[^0-9]' → 非數字字符 |
* | 前一個字符0次或多次 | 'ab*c' → “ac”, “abbc” |
+ | 前一個字符1次或多次 | 'ab+c' → “abc”, “abbc” (排除"ac") |
{n} | 前一個字符n次 | 'a{3}' → “aaa” |
| | 或操作 | 'cat|dog' → “cat” 或 “dog” |
三、實際示例
-
匹配以數字開頭的字符串
SELECT name FROM products WHERE name REGEXP '^[0-9]';
-
匹配包含特定單詞的文本
SELECT content FROM logs WHERE content REGEXP 'error|warning';
-
匹配郵箱格式
SELECT email FROM users WHERE email REGEXP '^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$';
-
匹配連續重復字符
SELECT word FROM dictionary WHERE word REGEXP '(.)\\1'; -- 如 "book"('oo')
四、與 LIKE
的區別
特性 | REGEXP | LIKE |
---|---|---|
功能 | 復雜模式匹配 | 簡單通配符 (% , _ ) |
大小寫敏感 | 默認不敏感(除非二進制字符串) | 依賴字段排序規則 |
性能 | 通常較慢(全表掃描) | 可能使用索引 |
五、進階函數(MySQL 8.0+)
-
REGEXP_REPLACE()
替換匹配的字符串:SELECT REGEXP_REPLACE('hello 123', '[0-9]+', 'world'); -- 結果: 'hello world'
-
REGEXP_SUBSTR()
提取匹配的子串:SELECT REGEXP_SUBSTR('abc def ghi', '[a-z]+'); -- 結果: 'abc'
-
REGEXP_INSTR()
返回匹配的起始位置:SELECT REGEXP_INSTR('abc123', '[0-9]+'); -- 結果: 4
六、注意事項
- 轉義特殊字符:使用雙反斜杠
\\
(如\\+
,\\.
)。 - 性能優化:避免在大型表上使用
REGEXP
,優先考慮全文索引或預處理。 - 大小寫敏感:如需區分大小寫,使用
BINARY
關鍵字:WHERE BINARY column_name REGEXP 'Pattern';
經典案例:提取文本中的金額
SELECT REGEXP_SUBSTR(description, '[0-9]+\\.[0-9]{2}') AS amount
FROM orders
WHERE description REGEXP '[0-9]+\\.[0-9]{2}';
匹配如 "Price: 99.99 USD"
中的 99.99
。