跳到主要内容

正则表达式速查:元字符、贪婪懒惰与前后断言全解

一篇能边读边试的正则速查。讲清 \d \w \s 等元字符、量词的贪婪与懒惰差异、前后断言用法,再给出邮箱手机 IP 三个可直接抄的真实模式。

发布于 作者 李雷
#正则表达式 #正则速查 #regex #元字符 #前后断言

正则表达式速查:从元字符到前后断言

正则写多了你会发现,真正卡住人的从来不是语法多,而是同一个符号在不同场景下行为微妙不同。这篇按「元字符,量词,断言,常用模式」四块整理,边读边在 /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,结果整段被当成一个标签;改成 <(.+?)> 懒惰版,.+? 在遇到第一个 > 就停,正确切出 ab 两个分组。解析成对标签时这一个 ? 就是对错分界。

前后断言:匹配位置而不消耗字符

断言只判断「某处是否成立」,不把字符算进匹配结果,所以叫零宽:

  • (?=...) 正向前瞻,后面要满足
  • (?!...) 负向前瞻,后面不能满足
  • (?<=...) 正向后顾,前面要满足
  • (?<!...) 负向后顾,前面不能满足

密码规则里常见的 (?=.*\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