DevBox

正则表达式怎么写?从零构造与实战技巧

DevBox 团队 · 最后更新 2026-07-02

想直接生成?试试 正则表达式测试器 —— 填参数即出结果。 打开工具 →

写正则的基本思路

写正则就是用符号描述”我要匹配的文本长什么样”,从左到右一段段拼:先想清楚”由哪些字符组成、各重复多少次、是否要固定开头结尾”。

第 1 步:描述字符

  • 具体字符直接写:abc
  • 一类字符用字符类:数字 \d、字母数字 \w、或自定义 [a-z][aeiou]
  • 任意字符用 .(默认不含换行)。

第 2 步:描述数量

给字符加量词说明重复几次:

  • \d{4} —— 恰好 4 个数字
  • \w+ —— 一个或多个字母数字
  • -? —— 可有可无的连字符
  • \d{2,4} —— 2 到 4 个数字

第 3 步:分组与选择

  • ( ) 把要整体重复或提取的部分括起来:(\d{4})-(\d{2}) 会捕获年和月两组。
  • 命名组更易读:(?<year>\d{4})
  • | 表示”或”:(jpg|png|gif)

第 4 步:加锚点定边界

  • ^ 开头、$ 结尾:^1[3-9]\d{9}$ 校验整串是手机号。
  • \b 单词边界:\bcat\b 只匹配独立的 cat,不匹配 category。

贪婪 vs 非贪婪(高频坑)

量词默认贪婪(尽量多匹配)。对 <a><b><.*> 会匹配整段;想只匹配 <a>,用非贪婪 <.*?>匹配”过头”时,先想想是不是该加 ?

在代码里用

同一条正则,各语言写法略不同:

  • JavaScript:/正则/flags,如 str.match(/\d+/g)
  • Python:import re; re.findall(r'\d+', s)(用 raw 字符串 r'' 避免反斜杠转义)
  • Java:Pattern.compile("\\d+")(字符串里反斜杠要双写)

写的时候在 正则表达式测试器 里实时看高亮和分组,确认无误再贴进代码。

继续学习

常见问题

贪婪和非贪婪有什么区别?

量词默认贪婪,尽量多匹配;在量词后加 ? 变非贪婪,尽量少匹配。例如对 <a><b>,.*? 只匹配到第一个 >,而 .* 会匹配到最后一个 >。

怎么只匹配"整串"而不是其中一部分?

用锚点把两端框住:^ 开头、$ 结尾。例如校验纯数字用 ^\d+$,而不是 \d+(后者只要包含数字就算匹配)。

继续了解 正则测试