每年Stack Overflow上有超过1200万个正则相关问题,但87%的开发者承认:他们至今靠复制粘贴活着。
这不是智商问题。正则表达式(Regular Expression,一种文本模式匹配规则)的设计初衷就是"写一次,读永远"——1970年代贝尔实验室的程序员Ken Thompson把它塞进Unix工具箱时,大概没料到50年后还有人对着[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}发呆。
今天这份清单,从字符类到贪婪陷阱,每个例子都能直接丢进生产环境。建议收藏,下次面试前翻一遍。
字符类:比你想的更野
方括号[]是正则的入门砖,但大多数人只用到[0-9]这种基础款。
真正省事的写法藏在反斜杠里:\d等于[0-9],\w等于[a-zA-Z0-9_],\s匹配所有空白字符(空格、制表符、换行)。
Java玩家有个隐藏技能:[a-z&&[^aeiou]]这种"交集"语法能直接筛出小写辅音字母。其他语言?老老实实写[bcdfghjklmnpqrstvwxyz]吧。
一个实战场景:提取驼峰命名里的每个单词。[A-Z][a-z]+匹配"HelloWorld"会抓到"Hello"和"World"——大写字母开头,后面跟至少一个小写字母。加号+的意思是"前面的东西出现1次或更多"。
电话号码提取更典型:[0-9]{3}-[0-9]{4}里的{3}是精确计数,匹配"555-1234"这种格式。花括号是正则里最容易被忽略的量化工具,很多人只会用星号加号。
贪婪陷阱:90%的bug来源
正则引擎默认"能吃多少吃多少"。
看这组对比:模式<.+>遇到输入bold,会一口吞下bold——从第一个<一直匹配到最后一个>。
加个问号?变成<.+?>,引擎立刻变乖:只匹配到第一个>就停,结果拆成和两个独立标签。
这个?叫"懒惰量词",和前面的可选含义完全不同。正则的上下文依赖性就是这么烦人——同一个符号在不同位置功能大变。
完整量词表建议刻进肌肉记忆:
星号*:0次或多次(贪婪)
加号+:1次或多次(贪婪)
问号?:0次或1次(贪婪){n}:精确n次{n,}:至少n次{n,m}:n到m次
每个后面都能跟?变懒惰模式。处理HTML、JSON、日志文件时,懒惰量词能救命——当然,正经解析这些格式应该用专用库,正则只是应急。
生产环境直接复制的模式
邮箱验证:[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}
这个版本覆盖了99%的合规邮箱,但别拿它当唯一校验——RFC 5322规定的合法邮箱格式复杂到能写本书,实际注册流程还得发验证邮件。
URL提取:https?://[^\s]+
s?让s变成可选,匹配http和https;[^\s]是"非空白字符"的简写,一直抓到空格为止。
国内手机号:1[3-9]\d{9}
第二位限定3-9排除虚拟号段,\d{9}补足剩余9位。比网上流传的各种冗长版本干净得多。
日志时间戳:\d{4}-\d{2}-\d{2}
ISO 8601基础日期格式,年月日各就各位。需要兼容时间的话扩展为\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}。
调试比写更重要
DevPlaybook的regex playground有个功能被低估了:实时高亮+分组可视化。
写复杂模式时,把匹配结果按捕获组着色,能立刻发现哪段逻辑在吞字符。比盯着黑底白字的测试输出高效十倍。
另一个冷知识:多数语言支持(?#注释)语法。生产代码里的正则建议写成
(?#协议)https?://(?#域名)[^\s]+
三个月后回来看,你会感谢自己。
最后留一道题:模式(\d)\1+能匹配什么?提示和"捕获组"有关,答案藏在大多数教程的附录里——而附录,恰恰是高手和新手的分水岭。
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.