🎮 前言:正则表达式是什么?
想象一下,你要在手机通讯录里找人:
找 "张" 开头的人 → 输入"张"就能找到
找 "139" 开头的电话 → 也能快速找到
但如果要找 "13开头、第4位是5或8、11位数字" 的手机号呢?这就是正则表达式出场的时候了!
📦 第一章:准备工作
1.1 确保你的MySQL版本支持
bash
sql
-- 查看MySQL版本(需要5.7以上)
SELECT VERSION();
-- 简单测试正则表达式功能
SELECT 'hello' REGEXP 'he'; -- 返回1(表示匹配)
SELECT 'world' REGEXP 'he'; -- 返回0(不匹配)
1.2 创建练习表
bash
sql
-- 创建一个简单的练习表
CREATE TABLE practice_data (
id INT AUTO_INCREMENT PRIMARY KEY,
phone VARCHAR(20),
email VARCHAR(50),
username VARCHAR(30)
);
-- 插入一些测试数据
INSERT INTO practice_data (phone, email, username) VALUES
('13800138000', 'zhangsan@qq.com', '张三'),
('13912345678', 'lisi@gmail.com', '李四'),
('abc123', 'wangwu@163.com', '王五'),
('150-5555-6666', 'error_email', '赵六'),
('18188889999', 'zhaoliu@hotmail.com', 'user_007'),
('手机号', 'test@test.com', '测试用户');
🎯 第二章:最简单的正则表达式
2.1 最基本用法:查找包含某段文字
bash
sql
-- 查找包含"张三"的记录
SELECT * FROM practice_data
WHERE username LIKE '%张三%'; -- 传统写法
SELECT * FROM practice_data
WHERE username REGEXP '张三'; -- 正则写法
-- 两者的结果一样!但...
2.2 找"开头是..."的数据
bash
sql
-- 找出手机号以"139"开头的用户
SELECT * FROM practice_data
WHERE phone LIKE '139%'; -- LIKE写法
SELECT * FROM practice_data
WHERE phone REGEXP '^139'; -- REGEXP写法
-- ^ 表示"开头"
-- 发音:"尖尖向上,指开头"
2.3 找"结尾是..."的数据
bash
sql
-- 找出邮箱以".com"结尾的用户
SELECT * FROM practice_data
WHERE email LIKE '%.com'; -- LIKE写法
SELECT * FROM practice_data
WHERE email REGEXP 'com$'; -- REGEXP写法
-- $ 表示"结尾"
-- 记忆:钱的符号在最后(结尾)
2.4 小练习:试试看!
bash
sql
-- 练习1:找出用户名以"张"开头的
SELECT * FROM practice_data WHERE username REGEXP '^张';
-- 练习2:找出邮箱以"163.com"结尾的
SELECT * FROM practice_data WHERE email REGEXP '163.com$';
-- 练习3:找出包含"test"的任何字段
SELECT * FROM practice_data
WHERE username REGEXP 'test'
OR email REGEXP 'test'
OR phone REGEXP 'test';
🔤 第三章:查找"某一个"字符
3.1 找任意单个字符
bash
sql
-- 查找用户名包含"张_"的(_表示任意一个字符)
SELECT * FROM practice_data
WHERE username LIKE '张_'; -- 只能匹配"张" + 1个字
SELECT * FROM practice_data
WHERE username REGEXP '张.'; -- 匹配"张" + 任意1个字
-- . 表示"任意一个字符"
-- 比如:张三、张四、张A 都能匹配
3.2 从几个字符中选一个
bash
sql
-- 查找139或138开头的手机号
SELECT * FROM practice_data
WHERE phone LIKE '139%' OR phone LIKE '138%'; -- 传统写法,麻烦!
SELECT * FROM practice_data
WHERE phone REGEXP '^13[89]'; -- 正则写法,简单!
-- [89] 表示:要么是8,要么是9
-- 13[89] 表示:138 或 139
3.3 更多例子
bash
sql
-- 查找手机号第二位是3、5、7、8、9的
SELECT * FROM practice_data
WHERE phone REGEXP '^1[35789]';
-- 查找用户名包含"张"或"李"的
SELECT * FROM practice_data
WHERE username REGEXP '[张李]';
-- [a-z] 表示:任意小写字母
-- [A-Z] 表示:任意大写字母
-- [0-9] 表示:任意数字
-- [张李王] 表示:张、李、王中的一个
3.4 小练习
bash
sql
-- 练习1:找出手机号以13或15开头的
SELECT * FROM practice_data WHERE phone REGEXP '^1[35]';
-- 练习2:找出用户名包含中文的
SELECT * FROM practice_data WHERE username REGEXP '[张李王赵]';
-- 练习3:找出邮箱包含数字的
SELECT * FROM practice_data WHERE email REGEXP '[0-9]';
🔢 第四章:找"重复的"字符
4.1 找连续出现的数字
bash
sql
-- 查找包含"连续2个8"的手机号
SELECT * FROM practice_data
WHERE phone REGEXP '88';
-- 但这样也会匹配到"888"、"1888"等
-- 如果我们想要"正好2个8"呢?
4.2 控制重复次数
bash
sql
-- {n} 表示:正好重复n次
-- {n,} 表示:至少重复n次
-- {n,m} 表示:重复n到m次
-- 查找包含"正好3个连续数字"的记录
SELECT * FROM practice_data
WHERE phone REGEXP '[0-9]{3}';
-- 查找包含"至少2个连续数字"的记录
SELECT * FROM practice_data
WHERE phone REGEXP '[0-9]{2,}';
-- 查找包含"2到4个连续数字"的记录
SELECT * FROM practice_data
WHERE phone REGEXP '[0-9]{2,4}';
4.3 特殊重复符号
bash
sql
-- * 表示:0次或多次(可有可无)
-- + 表示:1次或多次(至少1次)
-- ? 表示:0次或1次(可有可无)
-- 查找形如"138-8888-9999"的电话
SELECT * FROM practice_data
WHERE phone REGEXP '^[0-9]{3}-[0-9]{4}-[0-9]{4}$';
-- 查找包含字母和数字的用户名
SELECT * FROM practice_data
WHERE username REGEXP '[a-zA-Z]+[0-9]+';
4.4 小练习
bash
sql
-- 练习1:找出11位纯数字手机号
SELECT * FROM practice_data WHERE phone REGEXP '^[0-9]{11}$';
-- 练习2:找出用户名包含至少2个连续数字的
SELECT * FROM practice_data WHERE username REGEXP '[0-9]{2}';
-- 练习3:找出邮箱包含".com"或".cn"的
SELECT * FROM practice_data WHERE email REGEXP '\.(com|cn)$';
-- \. 表示真正的点号(不是任意字符)
-- | 表示"或者"
🏆 第五章:实战应用场景
5.1 验证手机号格式
sql
sql
-- 验证中国大陆手机号(简单版)
SELECT
phone,
CASE
WHEN phone REGEXP '^1[3-9][0-9]{9}$'
THEN '✅ 有效手机号'
ELSE '❌ 无效手机号'
END as 验证结果
FROM practice_data;
/* 规则解释:
^1 以1开头
[3-9] 第二位是3-9
[0-9]{9} 后面9位是数字
$ 结束
*/
5.2 验证邮箱格式
sql
sql
-- 验证邮箱格式(基础版)
SELECT
email,
CASE
WHEN email REGEXP '^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$'
THEN '✅ 有效邮箱'
ELSE '❌ 无效邮箱'
END as 验证结果
FROM practice_data;
/* 规则解释(拆开看):
^[A-Za-z0-9._%+-]+ 用户名部分:字母数字和特殊符号,至少1个
@ 必须有@符号
[A-Za-z0-9.-]+ 域名部分:字母数字点号减号,至少1个
\. 必须有真正的点号
[A-Za-z]{2,} 后缀:字母,至少2个
$ 结束
*/
5.3 清理数据
sql
sql
-- 找出所有纯数字手机号(清理脏数据)
SELECT * FROM practice_data
WHERE phone REGEXP '^[0-9]+$'
AND LENGTH(phone) = 11;
-- 找出所有格式正确的邮箱
SELECT * FROM practice_data
WHERE email REGEXP '@.+\..+'; -- 简单检查:有@和点号
-- 提取手机号中的纯数字
UPDATE practice_data
SET phone = REPLACE(REPLACE(phone, '-', ''), ' ', '')
WHERE phone REGEXP '[0-9]';
🚀 第六章:常用正则表达式模板
6.1 常用模板速查
python
sql
-- 1. 手机号验证
'^1[3-9][0-9]{9}$'
-- 2. 邮箱验证(基础)
'^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$'
-- 3. 身份证号(15位或18位)
'^[1-9][0-9]{14}$|^[1-9][0-9]{16}[0-9Xx]$'
-- 4. 日期格式(YYYY-MM-DD)
'^[0-9]{4}-[0-9]{2}-[0-9]{2}$'
-- 5. 中文姓名(2-4个汉字)
'^[\u4e00-\u9fa5]{2,4}$'
-- 6. 邮政编码
'^[1-9][0-9]{5}$'
-- 7. IP地址(简单版)
'^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$'
6.2 模板使用示例
sql
sql
-- 创建用户表
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(20),
phone VARCHAR(20),
email VARCHAR(50),
id_card VARCHAR(20)
);
-- 插入时验证数据
INSERT INTO users (name, phone, email, id_card)
SELECT
'张三',
'13800138000',
'zhangsan@qq.com',
'110101199001011234'
WHERE
'13800138000' REGEXP '^1[3-9][0-9]{9}$'
AND 'zhangsan@qq.com' REGEXP '^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$';
🧩 第七章:常见问题解答
Q1:正则表达式难学吗?
A: 就像学打字,开始慢,熟练了就快!建议每天学2-3个符号。
Q2:什么时候用LIKE,什么时候用REGEXP?
sql
sql
-- 简单情况用LIKE(更快)
SELECT * FROM users WHERE name LIKE '张%';
-- 复杂情况用REGEXP(功能强)
SELECT * FROM users WHERE phone REGEXP '^1[3-9][0-9]{9}$';
-- 判断标准:如果需要"或者"、"重复次数"、"字符集",就用REGEXP
Q3:正则表达式符号太多记不住?
python
sql
-- 制作自己的速查表
/*
^ 开头 如:^张
$ 结尾 如:com$
. 任意一个字符 如:张.
[] 选一个 如:[123]
{} 重复次数 如:[0-9]{11}
| 或者 如:com|cn
*/
Q4:写错了怎么办?
sql
sql
-- 先测试,再使用!
-- 错误示例:忘记转义点号
SELECT 'abc.com' REGEXP 'com$'; -- ✅ 返回1(正确)
SELECT 'abc.com' REGEXP '\.com$'; -- ✅ 返回1(正确)
SELECT 'abccom' REGEXP '\.com$'; -- ❌ 返回0(正确)
sql
-- 技巧:先用SELECT测试
SELECT '13800138000' REGEXP '^1[3-9][0-9]{9}$' as 是否手机号;
-- 返回1就是对的,返回0就是错的
常见错误
sql
sql
-- ❌ 错误:点号没转义
SELECT 'abc.com' REGEXP 'com$'; -- 正确,但可能误匹配
SELECT 'abccom' REGEXP 'com$'; -- 也会匹配!
-- ✅ 正确:转义点号
SELECT 'abc.com' REGEXP '\.com$'; -- 只匹配.com结尾
-- ❌ 错误:忘记加^和$
SELECT phone REGEXP '1[3-9][0-9]{9}'; -- 可能匹配到中间
-- 如:abc13800138000def 也会匹配!
-- ✅ 正确:加^和$限制
SELECT phone REGEXP '^1[3-9][0-9]{9}$'; -- 完全匹配
调试技巧
sql
sql
-- 技巧1:分步测试
-- 先测试部分正则
SELECT '13800138000' REGEXP '^1' as 步骤1; -- 应该返回1
SELECT '13800138000' REGEXP '^1[3-9]' as 步骤2; -- 应该返回1
SELECT '13800138000' REGEXP '^1[3-9][0-9]{9}$' as 步骤3; -- 应该返回1
-- 技巧2:用变量存储正则
SET @手机号正则 = '^1[3-9][0-9]{9}$';
SELECT '13800138000' REGEXP @手机号正则 as 是否手机号;
🎉 最后的鼓励
学习正则表达式就像学骑自行车:
第一天:歪歪扭扭,老摔跤(符号太多记不住)
第一周:能骑走了,但不太稳(基本功能会用)
第一个月:能上路了,还能带人(熟练应用)
半年后:各种花样随便玩(成为高手)
记住:
不用一次学会所有符号
从最常用的开始(^ $ . [])
多练习,多实践
遇到问题先拆分,再组合
📌 快速参考卡片(打印贴在墙上)
text
bash
最常用5个符号:
^ 开头 例:^张 → 以"张"开头
$ 结尾 例:com$ → 以"com"结尾
. 任意字符 例:张. → "张"后面跟1个字符
[] 选一个 例:[123] → 1或2或3
{} 重复次数 例:[0-9]{11} → 11个数字
常用模板:
bash
手机号:^1[3-9][0-9]{9}$
邮箱:^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$
💪 现在就开始吧!打开MySQL,复制上面的例子,动手试试看!
记住:最好的学习方式就是动手实践! 🚀
祝你学习顺利,早日成为正则表达式高手! 🎯