MySQL 中正则表达式 通过 REGEXP 或 RLIKE 操作符实现(两者等价),用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例:
一、基础语法
sql
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" |
| ` | ` | 或操作 |
三、实际示例
-
匹配以数字开头的字符串
sqlSELECT name FROM products WHERE name REGEXP '^[0-9]'; -
匹配包含特定单词的文本
sqlSELECT content FROM logs WHERE content REGEXP 'error|warning'; -
匹配邮箱格式
sqlSELECT email FROM users WHERE email REGEXP '^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$'; -
匹配连续重复字符
sqlSELECT word FROM dictionary WHERE word REGEXP '(.)\\1'; -- 如 "book"('oo')
四、与 LIKE 的区别
| 特性 | REGEXP |
LIKE |
|---|---|---|
| 功能 | 复杂模式匹配 | 简单通配符 (%, _) |
| 大小写敏感 | 默认不敏感(除非二进制字符串) | 依赖字段排序规则 |
| 性能 | 通常较慢(全表扫描) | 可能使用索引 |
五、进阶函数(MySQL 8.0+)
-
REGEXP_REPLACE()替换匹配的字符串:
sqlSELECT REGEXP_REPLACE('hello 123', '[0-9]+', 'world'); -- 结果: 'hello world' -
REGEXP_SUBSTR()提取匹配的子串:
sqlSELECT REGEXP_SUBSTR('abc def ghi', '[a-z]+'); -- 结果: 'abc' -
REGEXP_INSTR()返回匹配的起始位置:
sqlSELECT REGEXP_INSTR('abc123', '[0-9]+'); -- 结果: 4
六、注意事项
-
转义特殊字符 :使用双反斜杠
\\(如\\+,\\.)。 -
性能优化 :避免在大型表上使用
REGEXP,优先考虑全文索引或预处理。 -
大小写敏感 :如需区分大小写,使用
BINARY关键字:sqlWHERE BINARY column_name REGEXP 'Pattern';
经典案例:提取文本中的金额
sql
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。