在表单校验、接口参数检查、日志清洗、爬虫提取和数据处理过程中,正则表达式是非常常用的工具。很多开发者会直接从网上复制手机号、邮箱、URL 的正则规则,但并不一定理解每一段表达式的含义。本文从实际开发场景出发,讲清楚手机号、邮箱、URL 正则应该怎么写,以及常见误区和排查方法。
目录
[四、URL 正则怎么写?](#四、URL 正则怎么写?)
[七、Python 中如何使用正则?](#七、Python 中如何使用正则?)
[1. 校验手机号](#1. 校验手机号)
[2. 从文本中提取邮箱](#2. 从文本中提取邮箱)
[八、JavaScript 中如何使用正则?](#八、JavaScript 中如何使用正则?)
[1. 校验邮箱](#1. 校验邮箱)
[2. 提取 URL](#2. 提取 URL)
[1. 忘记加开头和结尾](#1. 忘记加开头和结尾)
[2. 点号没有转义](#2. 点号没有转义)
[3. 正则写得太复杂](#3. 正则写得太复杂)
[4. 只做前端校验](#4. 只做前端校验)
[5. 把正则当成万能工具](#5. 把正则当成万能工具)
一、正则表达式是什么?
正则表达式是一种用于匹配字符串规则的表达方式。
简单理解:
正则表达式不是用来"理解文本"的,而是用来判断文本是否符合某种模式。
例如判断一个字符串是不是 11 位数字:
^\d{11}$
这段正则可以拆开理解:
| 写法 | 含义 |
|---|---|
^ |
匹配字符串开头 |
\d |
匹配数字 |
{11} |
重复 11 次 |
$ |
匹配字符串结尾 |
所以它表示:
从开头到结尾,必须全部是 11 个数字。
如果没有 ^ 和 $,它就可能只匹配字符串中的一部分,而不是校验整个字符串。
二、手机号正则怎么写?
以中国大陆手机号为例,最简单的规则可以写成:
^1\d{10}$
含义是:
| 部分 | 含义 |
|---|---|
^ |
字符串开始 |
1 |
第一位必须是 1 |
\d{10} |
后面跟 10 位数字 |
$ |
字符串结束 |
这个规则能匹配:
13800138000
15912345678
19988886666
但它也可能匹配一些并不存在的号段,例如:
10000000000
所以更严格一点,可以写成:
^1[3-9]\d{9}$
含义是:
第一位是 1,第二位是 3 到 9,后面再跟 9 位数字。
这是目前比较常见的手机号校验方式。
手机号正则不要写得过死
有些规则会写成:
^1(3[0-9]|4[5-9]|5[0-35-9]|6[5-7]|7[0-8]|8[0-9]|9[0-35-9])\d{8}$
这种写法看起来更精确,但维护成本很高。运营商号段会变化,如果规则长期不更新,就可能误伤真实手机号。
所以在普通业务表单中,通常建议使用:
^1[3-9]\d{9}$
它足够简洁,也能覆盖大多数业务场景。
三、邮箱正则怎么写?
邮箱格式看起来简单:
username@example.com
但严格来说,邮箱标准非常复杂。如果完全按照 RFC 标准写一个正则,表达式会非常长,实际项目中反而不方便维护。
业务中常用的邮箱正则可以写成:
^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$
它可以匹配:
test@example.com
user.name@qq.com
hello-2026@gmail.com
admin_user@company.cn
拆开理解:
| 部分 | 含义 |
|---|---|
[A-Za-z0-9._%+-]+ |
邮箱名前半部分 |
@ |
必须包含 @ |
[A-Za-z0-9.-]+ |
域名主体 |
\. |
点号 |
[A-Za-z]{2,} |
顶级域名,至少 2 位 |
这里有一个细节:
\.
表示匹配真正的点号。
因为在正则中,. 表示匹配任意字符。如果想匹配普通点号,就需要转义。
邮箱校验不要追求绝对完美
很多人会尝试用一个正则判断邮箱是否真实存在,这是做不到的。
正则只能判断格式像不像邮箱,不能判断:
这个邮箱是否真实存在
这个邮箱是否能收到邮件
这个邮箱是否属于当前用户
如果业务真的需要确认邮箱有效,应该发送验证码或确认链接,而不是只依赖正则。
四、URL 正则怎么写?
URL 的格式也很复杂,包含协议、域名、端口、路径、查询参数、锚点等部分。
常用的简化 URL 正则可以写成:
^(https?:\/\/)?([\w.-]+)\.([a-zA-Z]{2,})(:\d+)?(\/[^\s]*)?$
它可以匹配:
https://example.com
http://example.com
example.com
https://www.example.com/path?id=1
https://example.com:8080/api/user
拆开理解:
| 部分 | 含义 |
|---|---|
(https?:\/\/)? |
可选的 http 或 https |
([\w.-]+) |
域名前缀 |
\. |
域名中的点 |
([a-zA-Z]{2,}) |
顶级域名 |
(:\d+)? |
可选端口 |
(\/[^\s]*)? |
可选路径和参数 |
如果业务要求必须以 http:// 或 https:// 开头,可以去掉第一个部分的问号:
^https?:\/\/([\w.-]+)\.([a-zA-Z]{2,})(:\d+)?(\/[^\s]*)?$
这样 example.com 就不会通过校验,必须写成:
https://example.com
五、正则里的常见符号
写正则时,先理解几个高频符号,会比死记表达式更有用。
| 符号 | 含义 |
|---|---|
^ |
字符串开始 |
$ |
字符串结束 |
. |
任意字符 |
\d |
数字 |
\w |
字母、数字、下划线 |
\s |
空白字符 |
+ |
出现 1 次或多次 |
* |
出现 0 次或多次 |
? |
出现 0 次或 1 次 |
{n} |
出现 n 次 |
{n,} |
至少出现 n 次 |
{n,m} |
出现 n 到 m 次 |
[] |
字符集合 |
() |
分组 |
| ` | ` |
\ |
转义 |
例如:
^[A-Za-z0-9]+$
表示:
从开头到结尾,只能由字母和数字组成,并且至少一个字符。
六、在线工具快速测试正则
正则表达式最大的问题是:看起来对,实际可能匹配错。
例如手机号正则:
1\d{10}
如果没有加 ^ 和 $,它可能在一段长文本中匹配到局部手机号,而不是校验整个输入。
比如:
我的手机号是13800138000,请联系我
上面的正则可以匹配其中的 13800138000。
但如果是表单校验,通常应该写成:
^1[3-9]\d{9}$
这样才能确保整个输入就是一个手机号。
如果只是临时测试手机号、邮箱、URL 正则,或者想验证一段文本是否能被正确匹配,可以使用工具帮的正则工具辅助处理:

点击你也试试:
正则表达式测试工具 - 在线正则工具箱 | 工具帮在线工具箱
正则测试这类任务规则明确、反馈直接,用在线工具比临时写脚本更快,也更适合接口参数校验和日志文本提取前的验证。
七、Python 中如何使用正则?
Python 中可以使用内置的 re 模块。
1. 校验手机号
import re
phone = "13800138000"
pattern = r"^1[3-9]\d{9}$"
if re.match(pattern, phone):
print("手机号格式正确")
else:
print("手机号格式错误")
注意这里使用了:
r"^1[3-9]\d{9}$"
前面的 r 表示原始字符串,可以减少反斜杠转义带来的问题。
2. 从文本中提取邮箱
import re
text = "请联系 test@example.com 或 admin@company.cn"
pattern = r"[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}"
emails = re.findall(pattern, text)
print(emails)
输出:
['test@example.com', 'admin@company.cn']
这里使用 findall(),表示从一段文本中找出所有匹配结果。
八、JavaScript 中如何使用正则?
JavaScript 中可以直接使用正则对象。
1. 校验邮箱
const email = "test@example.com"
const pattern = /^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$/
console.log(pattern.test(email))
输出:
true
2. 提取 URL
const text = "官网地址是 https://example.com/page?id=1"
const pattern = /https?:\/\/[^\s]+/g
const urls = text.match(pattern)
console.log(urls)
输出:
["https://example.com/page?id=1"]
这里的 g 表示全局匹配。
九、正则表达式常见坑
1. 忘记加开头和结尾
错误示例:
1[3-9]\d{9}
如果用于表单校验,应该写成:
^1[3-9]\d{9}$
否则可能只匹配输入中的一部分。
2. 点号没有转义
错误示例:
example.com
这里的 . 会匹配任意字符。
如果想匹配真正的点号,应该写:
example\.com
3. 正则写得太复杂
有些正则为了追求完整性,会变得非常长,后期几乎没人敢改。
实际业务中应优先考虑:
规则是否够用
是否容易维护
是否会误伤正常输入
是否需要后端二次校验
4. 只做前端校验
前端正则校验只能提升用户体验,不能作为安全边界。真正的参数校验必须在后端再次执行。
5. 把正则当成万能工具
正则适合处理规则明确的字符串匹配,不适合解析复杂嵌套结构。
例如 HTML、复杂 JSON、自然语言语义分析,不应该完全依赖正则处理。
十、总结
正则表达式是开发中非常实用的字符串处理工具,常用于手机号、邮箱、URL 校验,也常用于日志分析、文本提取和数据清洗。写正则时,不要只会复制规则,更要理解 ^、$、\d、\.、+、*、? 等基础符号的含义。
在实际项目中,正则规则不一定越复杂越好。手机号、邮箱、URL 这类校验应结合业务场景选择合适的严格程度。前端正则可以改善输入体验,但后端仍然必须做二次校验。遇到不确定的匹配结果时,可以先用在线工具测试,再放进代码中使用,这样能减少很多隐藏问题。
介绍给开发者朋友们
日常开发中,很多问题并不复杂,但如果每次都手动转换、格式化、校验或查询,会浪费不少时间。对于 JSON 格式化、时间戳转换、Base64 编解码、URL 编解码、HTTP 状态码查询、正则测试等高频操作,可以借助在线工具快速完成验证与处理。
在线工具站和 AI 并不是替代关系,而是适合不同场景。AI 更适合解释概念、分析复杂问题、生成代码思路;而在线工具更适合处理结果明确、规则固定的标准化任务。相比直接询问 AI,在线工具通常结果更确定、操作更直接、反馈更快,不需要组织提示词,也不用担心模型理解偏差,更适合在接口调试、数据清洗和日常排查中反复使用。
工具帮(MyToolBang)是一个面向全球各地中文开发者的在线工具箱,尽量把常用功能做得简单、直观、少干扰,适合开发者临时处理高频问题。
工具帮在线工具箱 - JSON格式化、时间戳转换、正则测试、SEO工具
