👨‍💻 关于作者:会编程的土豆

“不是因为看见希望才坚持,而是坚持了才看见希望。”

你好,我是会编程的土豆,一名热爱后端技术的Java学习者。

📚 正在更新中的专栏:

💕作者简介:后端学习者

在日常开发中,我们经常需要做“模糊但有规则”的匹配,比如:

  • 查找手机号格式是否正确

  • 判断邮箱是否合法

  • 从文本中提取特定字段

  • 清洗脏数据

这时候,普通的 LIKE 已经不够用了,就需要用到 正则表达式(REGEXP)

本文带你从 0 到掌握 MySQL 正则表达式,用最直接的方式讲清楚,避免绕弯


一、什么是正则表达式

正则表达式(Regular Expression)本质就是一套字符串匹配规则

你可以把它理解为: “用一种特殊语法,去描述字符串长什么样”

比如:

  • ^a:以 a 开头

  • b$:以 b 结尾

  • [0-9]:任意一个数字


二、MySQL 中的正则用法

MySQL 提供了两种方式:

1. REGEXP(常用)

SELECT * FROM 表名 WHERE 字段 REGEXP '正则表达式';

2. NOT REGEXP

SELECT * FROM 表名 WHERE 字段 NOT REGEXP '正则表达式';

三、基础语法

1. 单字符匹配

'a' REGEXP 'a'   -- true

2. 点号(.)

. 表示任意单个字符
SELECT 'abc' REGEXP 'a.c';  -- true

3. 字符集合 []

[abc] 表示 a 或 b 或 c
SELECT 'a' REGEXP '[abc]';  -- true
SELECT 'd' REGEXP '[abc]';  -- false

4. 范围匹配

[a-z]  小写字母
[A-Z]  大写字母
[0-9]  数字
SELECT 'g' REGEXP '[a-z]';  -- true

5. 取反

[^abc] 表示不是 a、b、c
SELECT 'd' REGEXP '[^abc]';  -- true

四、定位符(非常重要)

1. ^ 开头

SELECT 'abc' REGEXP '^a';  -- true

2. $ 结尾

SELECT 'abc' REGEXP 'c$';  -- true

3. 完整匹配

^...$ 表示整个字符串必须符合
SELECT 'abc' REGEXP '^abc$';  -- true
SELECT 'abcd' REGEXP '^abc$'; -- false

五、重复匹配(核心)

1. *

* 表示前一个字符出现 0 次或多次
SELECT 'aaa' REGEXP 'a*';  -- true

2. +

+ 表示至少 1 次
SELECT 'a' REGEXP 'a+';   -- true
SELECT '' REGEXP 'a+';    -- false

3. ?

? 表示 0 或 1 次

4. {n}

a{3} 表示 aaa
SELECT 'aaa' REGEXP 'a{3}';  -- true

5. {n,m}

a{2,4} 表示 2 到 4 次

六、实战

1. 判断手机号(中国大陆)

SELECT '13812345678' REGEXP '^1[3-9][0-9]{9}$';

2. 判断邮箱

SELECT 'test@qq.com' REGEXP '^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$';

3. 只包含数字

SELECT '12345' REGEXP '^[0-9]+$';

4. 包含中文

SELECT '你好' REGEXP '[\x{4e00}-\x{9fa5}]';

5. 查找包含数字的记录

SELECT * FROM user WHERE name REGEXP '[0-9]';

6. 查找以字母开头

SELECT * FROM user WHERE name REGEXP '^[A-Za-z]';

七、MySQL 8.0 新增函数

MySQL 8.0 提供了更强的正则函数:

1. REGEXP_LIKE

SELECT REGEXP_LIKE('abc', '^a');

2. REGEXP_REPLACE

SELECT REGEXP_REPLACE('abc123', '[0-9]', '');

 结果:abc


3. REGEXP_SUBSTR

SELECT REGEXP_SUBSTR('abc123xyz', '[0-9]+');

结果:123


4. REGEXP_INSTR

SELECT REGEXP_INSTR('abc123', '[0-9]');

返回位置


八、和 LIKE 的区别

对比项 LIKE REGEXP
模糊能力
语法 % _ 正则
性能 较好 较差
复杂匹配 不支持 支持

 结论:

  • 简单查询 → 用 LIKE

  • 复杂规则 → 用 REGEXP


九、性能注意事项

  1. 正则表达式不会走索引

  2. 大数据量下性能较差

  3. 尽量:

先用 WHERE 缩小范围,再用 REGEXP

十、总结

MySQL 正则表达式,本质就是三件事:

  1. 描述字符串规则

  2. 用 REGEXP 匹配

  3. 用函数做提取/替换

重点掌握:

  • ^ $(边界)

  • [ ](范围)

  • * + {}(次数)

  • MySQL 8 的四个函数

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐