正则表达式怎么匹配手机号、邮箱和 URL?常用规则与避坑指南

在表单校验、接口参数检查、日志清洗、爬虫提取和数据处理过程中,正则表达式是非常常用的工具。很多开发者会直接从网上复制手机号、邮箱、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工具