一、先记住这几个元字符
.任意单个字符(默认不含换行);\d数字,\w字母数字下划线,\s空白。[abc]字符集合,[^abc]取反,[a-z]范围。^行/串开头,$结尾;\b单词边界。|或,()分组捕获,(?:)只分组不捕获。
二、量词与贪婪
*0 次或多次,+1 次或多次,?0 或 1 次。{n}恰好 n 次,{n,m}n 到 m 次,{n,}至少 n 次。- 贪婪:默认量词尽可能多匹配。在量词后加
?变非贪婪,如.*?。写「抓取两个标签之间内容」时,贪婪是最常见的 bug 来源。
例:对 <a>1</a><a>2</a>,<a>.*</a> 会一次吞掉整行,而 <a>.*?</a> 会匹配到两段。
三、断言(不消耗字符)
(?=...) 正向前瞻、(?!...) 负向前瞻、(?<=...) 正向后顾。常用来做「必须包含大写字母」「排除某个前缀」这类条件,而不用把条件文字也匹配进结果里。注意部分语言(如老版本 JS)不支持后顾断言,跨语言前先确认。
四、8 个能直接用的例子
中国大陆手机号 ^1[3-9]\d{9}$
简单邮箱 ^[\w.+-]+@[\w-]+(\.[\w-]+)+$
IPv4(粗校验) ^(\d{1,3}\.){3}\d{1,3}$
日期 YYYY-MM-DD ^\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01])$
URL(http/https) ^https?:\/\/[^\s]+$
去除行首行尾空白 ^\s+|\s+$ (配合 gm 全局多行)
提取 HTML 标签内容 <([a-z]+)>(.*?)<\/\1>
中文字符 [\u4e00-\u9fa5]+
提醒:手机号、邮箱、日期这类「看起来对」的正则都只是格式粗校验。真要严格校验日期是否合法(比如 2 月 30 日)、手机号段是否真实分配,还是得交给业务逻辑或专门库,别把正则写成万能校验器。
五、修饰符
i 忽略大小写、g 全局、m 多行(让 ^$ 匹配每行首尾)、s 让 . 匹配换行。JS 里 /pattern/flags,Python 用 re.compile(pattern, flags),写法不同但语义一致。
六、怎么调试最快
别在业务代码里盲改。把样本文本和表达式贴进 正则测试工具,打开实时匹配高亮,先看「匹配到了什么」再看「有没有多匹配」;需要批量改写文本时用 文本批量替换 的正则模式,替换前先小样本验证。两个工具都在本地运算,日志、用户数据不外传。
排查顺序建议:先去掉量词看单字符能否匹配 → 逐步加量词 → 加分组 → 最后加断言。正则越复杂越难维护,能用字符串方法解决的就别硬写正则。
小结
元字符 + 量词 + 分组能覆盖八成需求;默认贪婪,加 ? 变非贪婪;复杂表达式一定先在测试工具里跑样本再上线。