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
。