正则表达式速查:元字符、贪婪懒惰与前后断言全解
一篇能边读边试的正则速查。讲清 \d \w \s 等元字符、量词的贪婪与懒惰差异、前后断言用法,再给出邮箱手机 IP 三个可直接抄的真实模式。
正则表达式速查:从元字符到前后断言
正则写多了你会发现,真正卡住人的从来不是语法多,而是同一个符号在不同场景下行为微妙不同。这篇按「元字符,量词,断言,常用模式」四块整理,边读边在 /zh/t/regex-cheatsheet/ 里把例子打进去试,比死记符号表快得多。
常用元字符:十二个先记牢
下面这些占了日常写法的九成:
\d数字,\w单词字符(字母数字下划线),\s空白.任意单字符(默认不含换行)*零或多次,+一或多次,?零或一次{n}恰好 n 次,{n,m}n 到 m 次[abc]字符集合,[^abc]取反()捕获分组,^行首,$行尾
一个具体例子:模式 \d{3,4} 在字符串 电话 010 转 8866 上,会先匹配到 010,再匹配到 8866,因为它要求连续 3 到 4 位数字。把 \d 换成 \w,8866 前若紧跟字母也会一并吃进去,这种细微差别在 /zh/t/regex-cheatsheet/ 的字符类分区里敲一遍就一目了然。
贪婪与懒惰:多吞还是少吞
* + {n,m} 默认是贪婪的,会尽量多匹配;后面加 ? 变懒惰,尽量少匹配。
拿 <a><b> 做实验:<(.+)> 这个贪婪写法会让 .+ 吞到 a><b,结果整段被当成一个标签;改成 <(.+?)> 懒惰版,.+? 在遇到第一个 > 就停,正确切出 a 和 b 两个分组。解析成对标签时这一个 ? 就是对错分界。
前后断言:匹配位置而不消耗字符
断言只判断「某处是否成立」,不把字符算进匹配结果,所以叫零宽:
(?=...)正向前瞻,后面要满足(?!...)负向前瞻,后面不能满足(?<=...)正向后顾,前面要满足(?<!...)负向后顾,前面不能满足
密码规则里常见的 (?=.*\d),意思是「整串某处必须有一个数字」,它不占位置,只做检查,因此可以和 (?=.*[A-Z]) 这类条件叠在一起写在模式开头。我自己排查登录校验时就靠这招:把 (?=.*\d) 单独丢进测试框,输入 abc1 通过、删掉 1 立刻失败,几秒就确认了规则没写反,不用再去翻三个标签页的旧问答。
三个能直接抄的常用模式
- 邮箱:
^[\w.+-]+@[\w-]+\.[\w.-]+$,先匹配用户名段,@后是域名与至少一级后缀 - 中国大陆手机号:
^1[3-9]\d{9}$,首位 1,第二位 3 到 9,再跟 9 位数字共 11 位 - IPv4:
^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$,四组 1 到 3 位数字用点分隔(范围校验另做)
这几个模式贴进代码前,务必拿真实数据各跑几条边界值,比如手机号试 12345678901(应拒)和 13900001111(应过)。需要看完整匹配,替换,捕获组结果时,切到 /zh/t/regex-tester/ 把整条正则连同文本一起跑,高亮和分组会逐项列出来。
一句话收尾
正则的难点是行为而非符号:贪婪与懒惰差一个 ?,断言匹配位置不吃字符,\d 在不同标志下范围也不同。与其背表,不如把这页当工作台,遇到拿不准的写法就当场敲一遍。
Made by Toolora · Updated 2026-06-13