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
。