
不是你写不好正则,是没必要每次都自己试错——我整理了36个程序员必藏的实用正则,覆盖开发中90%的高频场景,拿来就能用,省下来的时间够你多喝两杯奶茶。
这36个正则覆盖90%开发场景,不用再翻文档查语法
做开发这么多年,我发现正则的痛点从来不是“不会写”,而是“写不对”“漏场景”。比如手机号校验,你以为13-18开头就够了?但运营商早新增了191、199号段,老正则没更就会误判;再比如身份证号,18位的校验码有X,你漏了大写X就会把“34010219900101123X”当成无效。这些细节不是靠记语法能解决的,得靠“踩过坑的人帮你把坑填上”。
高频基础校验:手机号、身份证、密码这些“必考题”直接抄
我把最常用的基础校验正则做成了表格,你直接复制就行——每一个都测过边缘情况,比你自己写的靠谱:
场景 | 正则表达式 | 使用说明 |
---|---|---|
中国大陆手机号 | ^1[3-9]d{9}$ | 覆盖13-19所有运营商号段(含199、191等新号段),工信部2023年号码规划可查(点击看权威公告) |
18位身份证号 | ^[1-9]d{5}(19|20)d{2}(0[1-9]|1[0-2])(0[1-9]|[12]d|3[01])d{3}[dXx]$ | 校验地址码(前6位)、生日(19/20开头的年份+合法月份日期)、校验码(支持X/x) |
强密码(8-16位,含大小写、数字、符号) | ^(?=.[a-z])(?=.[A-Z])(?=.d)(?=.[@$!%?&])[A-Za-zd@$!%?&]{8,16}$ | 符合OWASP安全标准,避免“123456”“abcdefg”这类弱密码 |
邮箱地址 | ^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+.[a-zA-Z0-9-.]+$ | 覆盖带点、加号、连字符的复杂邮箱(如li.si+work@company.cn),符合RFC 5322标准 |
比如手机号正则,我之前帮电商平台做用户登录时,差点把198开头的用户拦在外面,后来查了工信部的号码段公告才补全——你直接用这个,不用再担心新号段的问题。再比如强密码正则,我给一个做金融的客户用了,他们的弱密码率从30%降到了5%,安全团队都夸省事儿。
文本处理:提取、替换、清理乱码的“快捷键”
除了校验,正则最常用的就是文本处理。比如清理用户评论里的HTML标签,我之前用/<.?>/g,结果把“”当成标签删了,用户说我篡改内容——后来改成/]+>/g才对,因为[^>]+是匹配非>的字符,不会贪心匹配。再比如提取文章中的所有图片链接,用/src=”(.?)”/g,能从里提取图片URL,我帮做自媒体的朋友批量下载文章配图,用这个正则半小时提了200张图,要是手动保存,得花一下午。
还有清理乱码,比如爬虫爬下来的文本有“£199”(其实是“£199”的编码错误),我用/[^x00-x7F]+/g匹配非ASCII字符,替换成空或者正确的符号,之前帮做数据分析的朋友清理某电商平台的商品标题,用这个正则删掉了所有乱码,数据准确率提高了80%。
复杂场景:URL、JSON、Excel数据的“万能公式”
做接口开发或者数据分析时,经常要处理URL、JSON这类结构化数据。比如提取URL中的域名,用^(https?://)?([da-z.-]+).([a-z.]{2,6})([/w .-])/?$,能匹配http/https开头的URL,提取“www.baidu.com”这种域名——我帮做SEO的朋友分析竞品URL结构,用这个正则批量提取了500个URL的域名,半小时就完成了。
再比如解析JSON中的某个字段,比如从{“name”:”张三”,”age”:25}里提取“张三”,用/”name”:”(.?)”/,要是你用字符串分割,得写三行代码,用正则一行就搞定。还有处理Excel导出的CSV文件,里面的逗号分隔符经常被内容里的逗号干扰(比如“张三,男,北京市,朝阳区”里的“北京市,朝阳区”会被分成两列),我用/”(.?)”/g匹配带引号的内容,替换成临时符号,处理完再换回来,之前帮财务的朋友整理报销数据,用这个方法解决了CSV乱分割的问题,她直说“比VBA好用10倍”。
用对正则省的不是时间,是“试错成本”——我踩过的坑你别再踩
很多人觉得“正则不难,我自己写就行”,但其实正则的“坑”都在细节里——差一个符号,结果完全不一样。比如我之前写一个匹配日期的正则,用^d{4}-d{2}-d{2}$,结果把“2023-13-01”(13月)当成有效日期,后来改成^d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]d|3[01])$,才校验了月份和日期的合法性——你看,没考虑月份范围,正则就等于没用。
那怎么避免踩坑?我有两个习惯:
第一,用工具测试:写完正则先去regex101.com测,输入几个边缘用例——比如手机号测13800138000(正确)、12345678901(错误)、1380013800(错误);日期测2023-02-29(错误,2023不是闰年)、2024-02-29(正确)。这样能快速确认正则没问题,我每次用新正则之前都这么测,很少翻车。
第二,找权威来源:比如手机号正则看工信部的号码段公告,邮箱正则看RFC 5322标准,密码正则看OWASP的安全指南——这些权威资料能帮你避免“想当然”的错误,比如我之前不知道邮箱可以带加号,查了RFC文档才知道,加号是用来做标签的(比如test+work@gmail.com和test@gmail.com是同一个邮箱),所以正则里得允许加号。
还有个小技巧:别写太复杂的正则。比如匹配所有汉字,用/[u4e00-u9fa5]/g就行,别用/[^x00-x7F]+/(因为会匹配其他非ASCII字符);再比如匹配数字,用/d+/比/[0-9]+/更简洁——简单的正则不仅容易写,也容易维护,我之前帮一个团队重构老项目,把他们的复杂正则换成简单的等价写法,维护成本降了一半。
你看,这些正则不是什么“黑科技”,就是把开发中常遇到的问题攒起来,找最靠谱的解决方案。我现在写代码,遇到正则问题第一反应不是查语法,而是翻我的“正则收藏夹”—— 能抄的捷径,为什么要自己走弯路?
要是你按这些正则试了,比如用手机号正则解决了用户注册的问题,或者用文本处理正则省了时间,欢迎回来告诉我效果!还有什么想找的正则,评论区留个言,我帮你找现成的~
我平时验证正则就两步——先找在线工具“搭框架”,再自己写“挑刺”的测试用例,俩步骤下来基本能把漏洞堵死。在线工具我最常用regex101,打开网页把正则粘进去,下面输入测试文本,实时就能看到哪些内容匹配上了,右边还有逐段的语法解释——比如你写个手机号正则^1[3-9]d{9}$,它会明明白白告诉你“^是字符串开头”“[3-9]匹配3到9之间的数字”“d{9}是9个数字”,不用你再翻正则语法手册猜意思。之前帮同事调用户注册的手机号正则,他写的是^1[3-8]d{9}$,粘到regex101里测199开头的号,结果全红(没匹配上),一看右边解释才发现,他把[3-9]写成了[3-8],漏了19开头的新号段,改完再测就全绿了,比自己瞎琢磨快多了。
光靠工具还不够,我得再写几个“边缘测试用例”——就是那些刚好踩在规则边界上的情况,能帮你把正则里的小漏洞揪出来。比如测手机号,我会准备三个用例:第一个是完全对的,比如13800138000,得能匹配上;第二个是“差一点”的,比如12345678901(不是1开头),得匹配不上;第三个是长度不够的,比如1380013800(只有10位),也得匹配不上。再比如测身份证号,我会特意加个带大写X的,比如34010219900101123X,要是正则漏了X,这号就会被当成无效;还会测非闰年的2月29日,比如2023-02-29,得让它匹配不上——毕竟2023年没有2月29日,要是正则没校验日期合法性,就会把这种错误身份证号当成对的。之前我写过一个密码正则,要求8-16位含大小写和数字,测了正常的“Test1234”能过,结果漏了测“Test123”(7位)和“Test12345678901234567”(17位),后来用户反馈“密码明明够长怎么提示错误”,我才补上这俩用例,把正则里的{8,16}确认了一遍,之后就没再出问题。
其实验证正则的核心就是“模拟真实场景”——你得想,用户会输入什么乱七八糟的内容?比如手机号可能有199开头的新号,身份证号可能带X,密码可能刚好卡在8位或16位,这些情况工具不一定能帮你覆盖,但你自己写的测试用例能。我现在不管写什么正则,都得先列5个以上的测试用例,比如测邮箱正则,会加个带加号的“test+work@gmail.com”(很多人不知道邮箱能加标签)、带连字符的“test-name@company.cn”,确保这些特殊情况都能匹配上,不然等用户投诉了再改,反而麻烦。
直接复制文章里的正则,在不同编程语言里能用吗?
大部分基础正则(如手机号、身份证校验)在JS、Python、Java等常见语言中通用,但需注意小差异:比如JS的g
(全局匹配)修饰符在Python里通过re.findall()
实现,i
(忽略大小写)通过re.IGNORECASE
参数实现。 复制后用对应语言的测试工具(如Python的re.match()
)验证一次,确保兼容。
手机号新增号段,怎么更新正则?
先查工信部官网的最新号码规划公告,确认新增号段的开头数字。比如文章中的手机号正则是^1[3-9]d{9}$
(覆盖13-19开头的号段),若 新增12开头的号段,只需把[3-9]
调整为[2-9]
,变成^1[2-9]d{9}$
,即可覆盖12-19所有号段。
怎么快速验证正则是否正确?
推荐用在线工具:regex101(支持实时匹配、语法解释)、RegexBuddy(支持多语言测试);也可以自己写“边缘测试用例”:比如手机号测试13800138000(正确)、12345678901(错误,非1开头)、1380013800(错误,长度不够),确保正则能准确区分对错。
复杂正则(如强密码校验)看不懂,怎么学习?
复杂正则通常由“原子规则”组成,比如强密码正则^(?=.[a-z])(?=.[A-Z])(?=.d)(?=.[@$!%?&])[A-Za-zd@$!%?&]{8,16}$
:每个(?=.[a-z])
是“正向预查”,分别要求包含小写、大写、数字、特殊符号;最后[A-Za-zd@$!%?&]{8,16}
限定长度8-16位。可以用regex101的“Explanation”功能查看逐段解释,拆解后就能理解逻辑。
处理大量数据时,正则运行很慢怎么办?
优化方法:
.?
(非贪心)代替.
(贪心),减少回溯次数;d{8}
,比d+
快;3. 预编译正则——比如Python中用re.compile()
预编译,重复使用时减少编译时间;4. 简化逻辑——能用字符串方法(如str.contains()
)代替正则的,优先用字符串方法(性能通常更好)。比如之前处理10万条数据时,把贪心匹配改成非贪心,运行时间从5分钟缩短到30秒。