news 2026/5/19 10:34:30

99% 的程序员都写不对“验证邮箱”的正则,不信你试试

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
99% 的程序员都写不对“验证邮箱”的正则,不信你试试

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

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

动作代码行数 (理想状态)描述
需求-从一堆乱码里提取手机号。
写正则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. 正则引擎很快匹配了前面的a
  2. 遇到!,匹配失败。
  3. 噩梦开始:引擎开始回溯。
  • “如果最后一个a不归这组,归那组呢?”
  • “如果最后两个a拆开呢?”
  1. 组合数量呈指数级爆炸。对于 30 个字符,它可能要尝试2^30次路径。
  2. 结果: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. 不要炫技:能用String.indexOf()split()解决的,别用正则。
  2. 不要造轮子:验证邮箱、URL、手机号,去搜成熟的、经过千万次验证的正则库,别自己瞎写。
  3. 小心回溯:永远警惕(a+)+这种嵌套量词结构。
  4. 写注释:如果非要写复杂的正则,请开启“详细模式”(Verbose Mode),给正则写上注释,否则明天的你也会想杀了自己的。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/2 21:22:50

ThreadLocal 为什么要用弱引用?

在 Java 并发编程的世界里&#xff0c;我们通常谈论的是“如何安全地共享数据”&#xff08;比如用 synchronized 或 Lock&#xff09;。 但在某些时候&#xff0c;我们根本不想共享。我们希望每个线程都有自己独立的一份数据&#xff0c;互不干扰。 这就是 ThreadLocal 的使…

作者头像 李华
网站建设 2026/5/15 7:06:52

通过bRequest分析未知usb设备(设备描述)操作意图

以下是对您提供的博文进行 深度润色与专业重构后的终稿 。我以一位长期从事嵌入式协议分析、USB固件逆向与硬件安全审计的一线工程师视角,彻底重写了全文—— 去除所有AI腔调、模板化结构与空泛表述,代之以真实调试现场的语言节奏、经验沉淀的判断逻辑、以及可立即上手的工…

作者头像 李华
网站建设 2026/5/19 1:51:55

YOLOv10支持opset=13导出ONNX,兼容性更强

YOLOv10支持opset13导出ONNX&#xff0c;兼容性更强 1. 为什么opset13导出这么重要&#xff1f; 你有没有遇到过这样的情况&#xff1a;在本地用PyTorch训练好的YOLOv10模型&#xff0c;导出成ONNX后&#xff0c;放到边缘设备上跑不起来&#xff1f;或者在不同推理引擎里报错…

作者头像 李华
网站建设 2026/5/15 8:26:47

消费级显卡福音!Z-Image-Turbo高效文生图实测

消费级显卡福音&#xff01;Z-Image-Turbo高效文生图实测 你是否也经历过这样的时刻&#xff1a;在深夜赶电商主图&#xff0c;打开Stable Diffusion&#xff0c;等了47秒才出第一张图&#xff1b;想给孩子画个童话插画&#xff0c;结果生成的字全是乱码&#xff1b;好不容易调…

作者头像 李华
网站建设 2026/5/7 10:23:01

一键生成专业问卷,让调研效率飞跃式提升!

在信息爆炸的时代&#xff0c;数据是决策的基石&#xff0c;而问卷调查则是获取一手数据最直接、最高效的手段。然而&#xff0c;设计一份结构严谨、问题精准、能有效触达目标人群并收集到有价值反馈的问卷&#xff0c;往往需要耗费大量时间与精力。从确定调研目的、构思问题框…

作者头像 李华
网站建设 2026/5/18 11:20:27

测试开机启动脚本真实体验:系统启动后自动执行无压力

测试开机启动脚本真实体验&#xff1a;系统启动后自动执行无压力 1. 开机启动这件事&#xff0c;到底谁在管&#xff1f; 你有没有试过写好一个脚本&#xff0c;放进 /etc/init.d/&#xff0c;运行 update-rc.d xxx defaults&#xff0c;重启后却发现——它没跑&#xff1f;或…

作者头像 李华