10 个最常用的正则表达式

· 约 2 分钟 🔎 正则测试

正则不需要背,但有 10 个模式能覆盖日常 80% 的校验场景。全部复制即用,同时说清每个表达式的限制——没有一个正则是”完美”的,取舍很重要。

1. 邮箱(宽松版)

^[\w.+-]+@[\w-]+(\.[\w-]+)+$

能覆盖 99% 常见邮箱。不要追求 RFC 5322 完美匹配——那个正则几千字符长,日常用不上。

2. 中国手机号

^1[3-9]\d{9}$

13-19 开头 11 位。不要只写 ^1\d{10}$,因为那会把很多无效第二位也放过去;^1[3-9]\d{9}$ 更贴近当前中国大陆手机号的常见校验口径。

3. URL(http/https)

^https?:\/\/[^\s/$.?#].[^\s]*$

允许带端口、路径、查询串。注意:[^\s]\s 是空白字符,这能排除 URL 中不该出现的空格。

4. IPv4 地址

^((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)$

0-255 每段都校验。别偷懒写 \d{1,3},那会把 999.999.999.999 放过去。

5. 中国身份证号

^\d{17}[\dXx]$

只校验格式,不校验校验位。真正的验证需要走 ISO 7064 MOD 11-2 算法,正则做不到。

6. 金额(最多两位小数)

^\d+(\.\d{1,2})?$

不允许千分位。如果允许 1,234.56^\d{1,3}(,\d{3})*(\.\d{1,2})?$

7. 日期(YYYY-MM-DD,宽松)

^\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01])$

校验月份和日的上下界,但不能判断闰年和 2 月 30 日这种非法日期——那种校验该交给日期库。

8. 中文字符

[\u4e00-\u9fa5]

基本汉字区间。如果需要覆盖扩展 A/B/C 区(罕见字、繁体古字),要加 \u3400-\u4dbf、代理对等,复杂得多。

9. 密码强度(至少 8 位,含大小写和数字)

^(?=.*[a-z])(?=.*[A-Z])(?=.*\d).{8,}$

(?=...) 是零宽断言,不消耗字符但要求后续内容必须能匹配。加 (?=.*[!@#$%^&*]) 可要求特殊字符。

10. 多个空白字符(合并用)

\s+

最不起眼但最常用的一个。配合 replace(/\s+/g, ' ') 可把任意多个空格/制表/换行合并成一个空格,清洗文本必备。

三个调试建议

  1. 命名捕获组 (?<year>\d{4})$1 $2 $3 可读性高一个量级
  2. 非捕获组 (?:...) 能让引擎少记录匹配位置,长文本上性能差异明显
  3. 贪婪 vs 非贪婪.* 尽可能多匹配,.*? 尽可能少匹配——HTML 解析踩坑最多的就是这个

实时测试

别在代码里反复改正则。把表达式贴进测试器,粘贴目标文本,匹配段高亮、分组捕获、替换预览一次性看清楚。

❓ 常见问题

为什么手机号不用 `^1\d{10}$`?

因为不是所有 `1` 开头的 11 位数字都是有效手机号。工信部分配的号段是 13X、14X、15X、16X、17X、18X、19X,第二位不能是 0、1、2。`^1[3-9]\d{9}$` 更准确。

贪婪匹配和非贪婪匹配哪个是默认?

默认是贪婪匹配——`.*` 尽可能多匹配。加 `?` 变非贪婪——`.*?` 尽可能少匹配。处理 HTML 标签提取时,`<.*>` 会错误地把多个标签匹配成一整块,应该用 `<.*?>`。

JavaScript 正则和 Python 正则语法一样吗?

基础语法 90% 一样,但有重要差异。JavaScript 没有 `\A`/`\Z` 边界(用 `^`/`$` 代替)、命名捕获语法 ES2018 才支持;Python 的 `re.VERBOSE` 模式可以加注释,JavaScript 没有。跨语言用时务必分别测试。

什么时候要转义斜杠 `/`?

只有在 JavaScript 正则字面量 `/pattern/` 里。在字符串构造(`new RegExp('pattern')`)或其他语言里都不用转义。所以 `/https:\/\//` 和 `new RegExp('https://')` 等价。

🔎 打开 正则测试 实时高亮 · 分组捕获 · 标志位

📖 同一工具的其他教程