

统一声明:
1.本站联系方式QQ:709466365 TG:@UXWNET 官方TG频道:@UXW_NET 如果有其他人通过本站链接联系您导致被骗,本站一律不负责! 2.需要付费搭建请联系站长QQ:709466365 TG:@UXWNET 3.免实名域名注册购买- 游侠云域名 4.免实名国外服务器购买- 游侠网云服务
别再东拼西凑查资料了!这篇就是程序员找了很久的“正则实用宝典”——不仅把正则的核心逻辑(元字符、量词、分组、断言)从“是什么”讲到“为什么这么用”,更贴紧真实工作场景:网页表单验证(手机号、邮箱、密码强度)、日志分析(提取IP、时间戳)、字符串处理(替换敏感词、分割内容),每类场景都给了能直接复制的示例,还标注了“避坑点”——比如“.?”的非贪婪匹配怎么避免漏内容,“正向断言”怎么精准定位想要的信息。
不管是刚入门想打基础,还是工作中需要快速解决问题,翻开这篇就能找到答案——把“抽象的正则”变成“能用的工具”,这不就是程序员要的“实用干货”吗?
你是不是也有过这种情况?想写个正则验证用户输入的手机号,搜出来的代码复制过去能用,但换成验证邮箱就懵了,根本不知道那些^、$、.到底啥意思;或者帮运维同事提取日志里的IP地址,结果把端口号也一起提出来,气得同事说“你这正则比我还能吃”?其实我之前也踩过这些坑,去年帮前端小周调正则的时候,他写的邮箱验证总把“test@.com”这种无效格式放过去,后来我跟他说清楚元字符的逻辑,他拍着脑袋说“原来我之前漏了域名部分的验证啊”。
正则为什么总让程序员头疼?其实是没摸透底层逻辑
要搞定正则,得先把“底层逻辑”掰碎了讲——其实就是元字符、量词、分组/断言这三个核心点,搞懂它们,你写正则就不会再“抄作业式”迷茫了。
先说说元字符,就是那些有特殊含义的符号,比如^代表“字符串开头”,$代表“字符串 ”,.代表“任意字符(除了换行)”,d代表“数字”,w代表“字母、数字、下划线”。我举个最常见的例子:验证11位手机号的正则是^1[3-9]d{9}$
,这里的^是说“必须从1开始”,$是说“必须到第11位结束”——要是没加这俩符号,比如“13812345678abc”这种带尾巴的字符串也会被匹配到,这就是很多人第一次写正则踩的坑。再比如“.”,你要是想匹配真正的“点”(比如IP地址里的.),得用转义符,写成.
——不然.会匹配任意字符,比如“192_168_1_1”也会被当成IP地址,这明显错了。
再讲量词,就是表示“重复次数”的符号,比如(0次或多次)、+(1次或多次)、?(0次或1次)、{n}(刚好n次)、{n,m}(n到m次)。这里最容易踩的“坑王”是贪婪匹配vs非贪婪匹配:比如.
是“贪婪”的,会尽可能多吃字符——比如“aabaa”用a.a
匹配,会把整个字符串都吃掉(因为它想找最长的匹配);而.?
是“非贪婪”的,会尽可能少吃——比如a.?a
只会匹配“aab”,剩下的“aa”不碰。我之前帮运营提取文章里的图片链接,用的是/<img src="(.?)">/
,就是靠非贪婪匹配才没把整个页面的图片链接都“吞”进去,不然运营得骂我“你这正则比爬虫还能爬”。
最后是分组和断言,分组用()把一部分正则包起来,方便“捕获结果”或者“重复使用”——比如(d{4})-(d{2})-(d{2})
可以把“2023-10-01”拆成“2023”“10”“01”三个分组,之后用$1、$2、$3就能取出来。而断言是“检查条件但不消耗字符”,比如正向预查(?=...)
(后面必须有什么)、负向预查(?!...)
(后面不能有什么)——比如密码强度验证要求“8-16位,包含大小写字母、数字、特殊字符中的至少三种”,正则是^(?=.[a-z])(?=.[A-Z])(?=.d)(?=.[@$!%?&])[A-Za-zd@$!%?&]{8,16}$
,这里的每个(?=...)
都是“预查”:(?=.[a-z])
是说“后面必须有小写字母”,但不会把这个字母算进匹配结果里——这样才能同时满足多个条件,不然你根本没法让正则“同时检查四个要求”。
程序员最常用的10个正则场景,直接抄作业就行
讲完底层逻辑,再给你上点“硬货”——我整理了程序员天天用得到的10个正则场景,每个都附了“需求+正则+避坑点”,直接复制就能用,省得你再去百度翻零散资料。
场景1:表单验证(前端最常碰)
表单验证是前端的“家常便饭”,比如手机号、邮箱、密码强度,这三个正则我都写烂了:
^1[3-9]d{9}$
——避坑点:一定要加^和$,不然会匹配到“13812345678a”这种无效字符串;^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(.[a-zA-Z0-9_-]+)+$
——避坑点:别漏掉(.[a-zA-Z0-9_-]+)+
,不然“test@com”这种没有后缀的格式也会通过;^(?=.[a-z])(?=.[A-Z])(?=.d)(?=.[@$!%?&])[A-Za-zd@$!%?&]{8,16}$
——避坑点:预查部分不能少,比如漏了(?=.[A-Z])
,纯小写+数字的密码也能通过,达不到强度要求。场景2:日志分析(运维/后端的“救命药”)
运维和后端经常要从日志里提取信息,比如IP地址、时间戳,这两个正则能帮你省半天时间:
^((25[0-5]|2[0-4]d|[01]?dd?).){3}(25[0-5]|2[0-4]d|[01]?dd?)$
——避坑点:要验证每个段的数字范围(0-255),不然“256.0.0.1”这种无效IP也会被提出来;^d{4}-d{2}-d{2} d{2}:d{2}:d{2}$
——避坑点:注意空格和冒号的位置,要是把空格写成点,“2023-10-01.14:30:00”也会被匹配到。场景3:字符串处理(全岗位都能用)
还有些“通用场景”,比如替换敏感词、分割URL参数,这些正则我每周都要用:
/(垃圾|脏话)/g
——避坑点:要加g修饰符,不然只替换第一个匹配项(比如“你这是垃圾垃圾”只会变成“你这是垃圾”);/id=(d+)/
——避坑点:要加括号分组,不然拿到的是“id=123”整个字符串,还要自己截取;内容
→内容)”,正则是/]+>/g
——避坑点:用[^>]
匹配标签内的内容,避免匹配到换行(比如
内容n
也能处理)。
为了让你更清楚,我把这些场景整理成了表格,直接抄就行:
场景 | 需求描述 | 正则表达式 | 避坑点 |
---|---|---|---|
手机号验证 | 11位,以1开头,第二位3-9 | ^1[3-9]d{9}$ | 必须加^和$,避免匹配长字符串 |
邮箱验证 | 合法邮箱格式(用户名@域名.后缀) | ^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(.[a-zA-Z0-9_-]+)+$ | 不要漏掉域名后的后缀部分 |
密码强度验证 | 8-16位,包含大小写字母、数字、特殊字符中的至少三种 | ^(?=.[a-z])(?=.[A-Z])(?=.d)(?=.[@$!%?&])[A-Za-zd@$!%?&]{8,16}$ | 预查部分不能少,否则无法满足强度要求 |
IP地址提取 | 提取IPv4地址(xxx.xxx.xxx.xxx) | ^((25[0-5]|2[0-4]d|[01]?dd?).){3}(25[0-5]|2[0-4]d|[01]?dd?)$ | 要验证每个段的数字范围(0-255) |
时间戳提取 | 提取yyyy-MM-dd HH:mm:ss格式的时间 | ^d{4}-d{2}-d{2} d{2}:d{2}:d{2}$ | 注意空格和冒号的位置,避免匹配错误格式 |
其实这些正则我都是“踩坑踩出来的”——去年帮后端小王处理日志,他用我给的IP正则提取了一万条日志里的IP地址,只花了5分钟,之前他手动筛要半天;前端小周用我给的密码正则,解决了用户反馈的“弱密码能通过”的问题,领导还夸他“细心”。对了,MDN web docs里关于正则断言的说明很详细,你要是想深入学,可以去看看MDN的这篇文章,写得比我还清楚。
你要是还有什么正则问题,比如遇到没见过的场景,或者写出来的正则总出错,欢迎留言告诉我——毕竟我也是踩过无数坑才摸透这些门道的,能帮你省点时间,我也开心。
本文常见问题(FAQ)
为什么我抄的正则总出错,是不是没搞懂底层逻辑?
其实很多人写正则出错,都是因为只抄代码没摸透“元字符、量词、分组/断言”这三个核心逻辑。比如验证手机号时,没加^(开头)和$( ),结果“13812345678abc”这种带尾巴的字符串也能匹配;或者写邮箱正则时,漏了域名后的后缀部分(比如“test@.com”这种无效格式也放过去)。我去年帮前端小周调邮箱正则时,他就是没搞懂元字符的逻辑,后来我跟他说清楚^和$的作用,还有域名后缀的验证规则,他才明白问题出在哪。
所以想写对正则,得先把底层逻辑掰碎了学——比如.代表任意字符(除了换行),d代表数字,是0次或多次,?是非贪婪匹配。搞懂这些,你再写正则就不会“抄作业式”迷茫了。
表单验证的正则总漏条件,比如手机号、邮箱怎么写才对?
表单验证是前端最常碰的场景,文章里给了现成的正则和避坑点。比如手机号验证要用^1[3-9]d{9}$——^是说“必须从1开始”,$是说“必须到第11位结束”,这样就不会匹配到带尾巴的字符串;邮箱验证要用^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(.[a-zA-Z0-9_-]+)+$,这里的(.[a-zA-Z0-9_-]+)+是说“域名后面必须有至少一个后缀”,比如“test@example.com.cn”这种格式才会通过,避免“test@.com”这种无效格式。
还有密码强度验证,要加预查(?=…),比如^(?=.[a-z])(?=.[A-Z])(?=.d)(?=.[@$!%?&])[A-Za-zd@$!%?&]{8,16}$,这样才能确保密码包含大小写、数字、特殊字符中的至少三种,不会让弱密码通过。
提取日志里的IP地址总带端口,怎么解决?
提取IP地址时带端口,主要是因为正则没限制“IP的格式范围”。文章里给的IP正则是^((25[0-5]|2[0-4]d|[01]?dd?).){3}(25[0-5]|2[0-4]d|[01]?dd?)$——这个正则会验证每个段的数字在0-255之间,而且用^和$限制了开头和 这样“192.168.1.1:8080”里的端口号就不会被匹配到,因为端口号是在IP后面加了:和数字,超出了$的范围。
我之前帮运维同事提取IP时,他就是用了没限制范围的正则(比如d+.d+.d+.d+),结果把端口号也一起提出来,后来换成文章里的正则,就解决了这个问题。
非贪婪匹配(.?)怎么用才不会漏内容?
非贪婪匹配(.?)的关键是“尽可能少吃字符”,所以用的时候要结合具体场景。比如提取文章里的图片链接,要用/<img src="(.?)”>/——这里的(.?)会匹配到第一个双引号结束的内容,不会把后面的“>”或者其他标签也吞进去;如果用贪婪匹配(.),就会匹配到整个长字符串(比如“
”里的“test1.jpg”> <img src="test2.jpg%E2%80%9D%EF%BC%89%EF%BC%8C%E5%AF%BC%E8%87%B4%E6%BC%8F%E5%86%85%E5%AE%B9%E3%80%82
%E6%88%91%E4%B9%8B%E5%89%8D%E5%B8%AE%E8%BF%90%E8%90%A5%E6%8F%90%E5%8F%96%E5%9B%BE%E7%89%87%E9%93%BE%E6%8E%A5%E6%97%B6%EF%BC%8C%E4%B8%80%E5%BC%80%E5%A7%8B%E7%94%A8%E4%BA%86.%EF%BC%8C%E7%BB%93%E6%9E%9C%E6%8A%8A%E6%89%80%E6%9C%89%E5%9B%BE%E7%89%87%E9%93%BE%E6%8E%A5%E9%83%BD%E6%8B%BC%E6%88%90%E4%B8%80%E4%B8%AA%E9%95%BF%E5%AD%97%E7%AC%A6%E4%B8%B2%EF%BC%8C%E5%90%8E%E6%9D%A5%E6%8D%A2%E6%88%90.?%EF%BC%8C%E5%B0%B1%E5%87%86%E7%A1%AE%E6%8F%90%E5%8F%96%E4%BA%86%E6%AF%8F%E4%B8%AA%E5%9B%BE%E7%89%87%E7%9A%84src%E5%B1%9E%E6%80%A7%EF%BC%8C%E6%B2%A1%E5%86%8D%E6%BC%8F%E5%86%85%E5%AE%B9%E3%80%82%E6%89%80%E4%BB%A5%E7%94%A8%E9%9D%9E%E8%B4%AA%E5%A9%AA%E5%8C%B9%E9%85%8D%E6%97%B6%EF%BC%8C%E8%A6%81%E7%A1%AE%E4%BF%9D%E5%AE%83%E2%80%9C%E5%90%83%E2%80%9D%E7%9A%84%E8%8C%83%E5%9B%B4%E5%88%9A%E5%A5%BD%E6%98%AF%E4%BD%A0%E8%A6%81%E7%9A%84%E5%86%85%E5%AE%B9%EF%BC%8C%E5%88%AB%E8%AE%A9%E5%AE%83%E5%90%9E%E5%A4%AA%E5%A4%9A%E3%80%82
%0A
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 如遇到加密压缩包,请使用WINRAR解压,如遇到无法解压的请联系管理员!
8. 精力有限,不少源码未能详细测试(解密),不能分辨部分源码是病毒还是误报,所以没有进行任何修改,大家使用前请进行甄别!
站长QQ:709466365 站长邮箱:709466365@qq.com