news 2026/4/23 6:47:57

<span class=“js_title_inner“>99% 的程序员都写不对“验证邮箱”的正则,不信你试试</span>

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
<span class=“js_title_inner“>99% 的程序员都写不对“验证邮箱”的正则,不信你试试</span>
关注我们,设为星标,每天7:30不见不散,每日java干货分享

🕸️ 正则表达式:理想中的“魔法咒语”

在新手眼里,正则就是一行代码搞定所有复杂的查找替换:

动作

代码行数 (理想状态)

描述

需求

-

从一堆乱码里提取手机号。

写正则

1 行

1[3-9]\d{9}

运行

-

瞬间匹配,精准提取。

结果

-

感觉自己像个黑客。

现实是:你为了匹配一个电子邮箱,写了一串200 个字符的乱码。一个月后,你的同事(或者你自己)看到这行代码,就像在看甲骨文


😵 第一关:只写语言 (Write-Only Language)

正则表达式是编程界公认的**“一次性用品”**。

场景:
你接手了离职同事的代码,看到一行用来“校验密码强度”的正则:
^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@$!%*?&])[A-Za-z\d@$!%*?&]{8,}$

恐怖故事:
老板说:“在这个基础上,加一个需求:允许下划线_,但不允许空格。”

你的反应:
你盯着那堆?=.[]看了半小时,眼睛都花了。
你试图在中间插入一个_
Boom!原本能通过的密码现在报错了,或者原本该拦截的现在放过了。
你根本不敢动它。它变成了一块**“不可触碰的圣石”**。

后果:
你最后选择在正则外面又写了一层if (password.includes("_"))
代码变得越来越丑,逻辑越来越割裂。


⏳ 第二关:灾难性回溯 (Catastrophic Backtracking)

这是正则最黑暗、最危险的一面。它能让你的服务器 CPU 瞬间飙到 100%,然后死机。这叫ReDoS (正则拒绝服务攻击)

原理:
正则引擎大多是 NFA(非确定性有限自动机)。当它匹配不成功时,它会**“回溯”**(Backtrack),尝试另一种组合。
如果你写了“嵌套的量词”,比如(a+)+$

场景:
正则:^(\w+)+$(看起来是为了匹配一串单词字符)。
输入:aaaaaaaaaaaaaaaaaaaaaaaaaaaa!(最后加个感叹号)。

恐怖故事:

  1. 1. 正则引擎很快匹配了前面的a

  2. 2. 遇到!,匹配失败。

  3. 3.噩梦开始:引擎开始回溯。

  • • “如果最后一个a不归这组,归那组呢?”

  • • “如果最后两个a拆开呢?”

  1. 4. 组合数量呈指数级爆炸。对于 30 个字符,它可能要尝试2^30次路径。

  2. 5.结果:CPU 单核直接 100%,服务器卡死,连 SSH 都连不上。

真实案例:
2019 年,Cloudflare全球宕机。
原因就是某工程师写了一个带有回溯缺陷的正则,用来拦截恶意代码。结果这个正则被一段恶意字符串触发,把自己家的 CPU 跑爆了。


🍽️ 第三关:贪婪的吞噬 (Greedy Matching)

这是新手最容易犯的逻辑错误。

场景:
你想从一段 HTML 里提取标签内容:<b>Hello</b>world<b>Bye</b>
你写的正则:<b>(.*)</b>
你以为你会得到HelloBye

恐怖故事:
正则默认是贪婪的。
.*会一直往后吃,吃到最后一个</b>才停下来。
结果:
你匹配到的是:Hello</b>world<b>Bye
整个字符串被当成了一块肉,全吞了。中间的结构全乱了。

后果:
你的页面解析逻辑完全错误,把不该显示的代码显示出来了。
修正:必须加一个问号.*?变成非贪婪模式。但这又是一个只有老鸟才知道的坑。


📧 第四关:完美的幻觉 (The Email Fallacy)

几乎每个程序员都写过“验证邮箱”的正则。
几乎每个程序员写的都是的。

场景:
你写了:^[a-zA-Z0-9]+@[a-zA-Z0-9]+\.[a-z]+$
你觉得很稳。

恐怖故事:

  • • 用户 A 输入:jim+test@gmail.com(报错!你不支持+)。

  • • 用户 B 输入:123@127.0.0.1(报错!你不支持 IP 地址)。

  • • 用户 C 输入:admin@公司.cn(报错!你不支持中文域名)。

真相:
根据RFC 5322标准,一个真正完美匹配所有合法邮箱的正则表达式,长度超过6000 个字符
你根本写不出来,也看不懂。

后果:
你因为自己那个“简陋”的正则,把很多真实有效的用户挡在了门外。


🏗️ 第五关:用正则解析 HTML (The Zalgo)

这是 Stack Overflow 上的著名传说。
很多新手试图用正则去解析 HTML 结构(比如提取所有div里的图片)。

恐怖故事:
HTML 不是正则语言,它是上下文无关语法。
用正则去解析 HTML,就像是用一把尺子去测量大海的深度

  • • 如果 HTML 里有嵌套的div怎么办?

  • • 如果div换行了怎么办?

  • • 如果属性值里有>符号怎么办?

后果:
你写出来的正则极其脆弱,网页稍微变动一点点,你的爬虫就挂了。
永远不要用正则解析 HTML,请用 DOM Parser(如 Jsoup, Beautiful Soup)。


💡 结论:强大的魔鬼

正则表达式就像核能

  • • 用好了,它是最高效的文本处理引擎。

  • • 用不好(稍微写错一个符号),它就是 CPU 的黑洞,是维护者的地狱。

生存指南:

  1. 1.不要炫技:能用String.indexOf()split()解决的,别用正则。

  2. 2.不要造轮子:验证邮箱、URL、手机号,去搜成熟的、经过千万次验证的正则库,别自己瞎写。

  3. 3.小心回溯:永远警惕(a+)+这种嵌套量词结构。

  4. 4.写注释:如果非要写复杂的正则,请开启“详细模式”(Verbose Mode),给正则写上注释,否则明天的你也会想杀了自己的。

推荐阅读 点击标题可跳转

50个Java代码示例:全面掌握Lambda表达式与Stream API

16 个 Java 代码“痛点”大改造:“一般写法” VS “高级写法”终极对决,看完代码质量飙升!

为什么高级 Java 开发工程师喜爱用策略模式

精选Java代码片段:覆盖10个常见编程场景的更优写法

提升Java代码可靠性:5个异常处理最佳实践

为什么大佬的代码中几乎看不到 if-else,因为他们都用这个...

还在 Service 里疯狂注入其他 Service?你早就该用 Spring 的事件机制了

看完本文有收获?请转发分享给更多人

关注「java干货」加星标,提升java技能

❤️给个「推荐 」,是最大的支持❤️

.cls-1{fill:#001e36;}.cls-2{fill:#31a8ff;}

.cls-1{fill:#001e36;}.cls-2{fill:#31a8ff;}

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/20 20:40:16

方盾 KN100:让煤矿从业者远离粉尘危害 安心坚守

煤炭行业作为能源供给的核心支柱&#xff0c;众多从业者扎根井下一线&#xff0c;以坚守保障着产业的稳定运转。然而&#xff0c;井下作业环境错综复杂&#xff0c;煤尘、岩尘等细微颗粒物弥漫其中&#xff0c;长期吸入这些颗粒物会引发煤工尘肺等严重的职业病&#xff0c;成为…

作者头像 李华
网站建设 2026/4/12 14:35:14

MindSpore 多模态大模型进阶:跨模态对齐增强 + 算力高效调度

在图文生成、视觉问答&#xff08;VQA&#xff09;等多模态任务中&#xff0c;“跨模态特征不对齐” 与 **“多编码器算力负载失衡”** 是制约模型性能的核心瓶颈 —— 前者导致文本 - 图像语义匹配精度低&#xff0c;生成内容 “文不对图”&#xff1b;后者使训练算力利用率不…

作者头像 李华
网站建设 2026/4/18 1:34:30

SpringCloud网页端如何支持百M大文件的上传与下载?

大三党毕业设计救星&#xff1a;10G大文件上传加密断点续传&#xff08;原生JSSpringBoot&#xff09; 兄弟&#xff0c;作为山西某高校软工专业的大三老狗&#xff0c;我太懂你现在的处境了——毕业设计要做文件管理系统&#xff0c;甲方&#xff08;老师&#xff09;要10G大…

作者头像 李华
网站建设 2026/3/20 7:51:31

SCI论文怎么降AI率?2026年英文论文降AI工具推荐

SCI论文怎么降AI率&#xff1f;2026年英文论文降AI工具推荐 SCI投稿越来越严了&#xff0c;很多期刊开始要求AIGC检测报告。 用GPT或DeepSeek写的英文论文&#xff0c;Turnitin AI检测一查&#xff0c;AI率80%。 如果你也面临这个问题&#xff0c;这篇文章告诉你怎么解决。 …

作者头像 李华