一、前言:正则表达式到底是啥?

正则表达式(Regular Expression, Regex) 是一种“字符串模式匹配语言”。它能用简洁规则描述你要找的文本模式,比如:

  • 找手机号、邮箱、身份证
  • 找到日志里的时间、IP、URL
  • 批量替换文本(把多个空格变成一个;把 YYYY/MM/DD 变成 YYYY-MM-DD
  • 校验输入合法性(密码强度、用户名格式)

可以用一句话来总结:正则 = 用规则描述字符串结构,并进行查找/匹配/提取/替换,简要说:

  1. 匹配(match/test):判断是否符合规则
  2. 提取(find/capture):从字符串中“抓”想要的部分
  3. 替换(replace/sub):把匹配到的内容替换成别的

二、正则字符对照表

这里我们先给出重要的参数对照表,因为这些是理解正则表达式的基础,你可以先不完全理解,后面会展开讲。

2.1 元字符速查表

分类符号含义例子说明
通配.匹配除换行外任意字符a.cabca1c
行首行尾^行/字符串开始^abc以 abc 开头
行首行尾$行/字符串结束abc$以 abc 结尾
选择|cat|dog匹配 cat 或 dog
分组(...)捕获分组(ab)+捕获匹配内容
非捕获分组(?:...)不捕获,只分组(?:ab)+更省资源
字符集[...]匹配其中任意一个字符[abc]a 或 b 或 c
取反字符集[^...]匹配不在集合里的字符[^0-9]非数字
转义\转义元字符/表示特殊类\. \d匹配点/数字
边界\b单词边界\bcat\b只匹配独立 cat
非边界\B非单词边界\Bcat\Bcat 两侧都不是边界
反向引用\1 \2 ...引用第 n 个捕获组(\w+)\s+\1重复单词
前瞻(?=...)右侧必须能匹配(不消耗字符)a(?=b)a 后面必须是 b
负前瞻(?!...)右侧必须不能匹配a(?!b)a 后面不能是 b
后顾(?<=...)左侧必须能匹配(不消耗字符)(?<=\$)\d+找 $ 后数字
负后顾(?<!...)左侧必须不能匹配(?<!\$)\d+前面不是 $ 的数字

2.2 特殊字符类速查表

符号含义等价例子
\d数字[0-9]\d+
\D非数字[^0-9]\D+
\w单词字符[A-Za-z0-9_]\w+
\W非单词字符[^A-Za-z0-9_]\W+
\s空白字符[ \t\r\n\f\v]\s+
\S非空白字符[^ \t\r\n\f\v]\S+
[一-龢]中文汉字[\u4e00-\u9fa5](unicode编码)\S+

2.3 字符集:写正则的基本功

(1)最常见写法

  • [abc]:匹配 a 或 b 或 c 任意一个字符
  • [a-z]:小写字母
  • [A-Z]:大写字母
  • [0-9]:数字
  • [a-zA-Z0-9_]:等价 \w(很多场景更可控)

(2)取反 [^...]

  • [^0-9]:匹配非数字
  • [^,\n]+:匹配不含逗号/换行的一段(CSV/日志常用)

(3)字符集里的特殊规则

  1. - 在中间表示范围:[a-z],若要匹配字面量 -,放开头或结尾:[-a][a-] 或转义 \-
  2. ^[] 开头才是“取反”:[^a],如果不在开头就是普通字符:[a^b]
  3. ] 如果要作为普通字符,通常放在最开头:[]a],或者转义
  4. .[] 里是普通点,不是通配:[.]

三、量词对照表

量词控制 “前一个元素出现多少次”。前一个元素可以是:一个字符、一个字符类、一个分组、一个点 . 等。

3.1 基本量词表(默认是贪婪匹配)

量词含义等价说法示例能匹配
*0 次或多次“可有可无很多次”a*""aaaaa
+1 次或多次“至少一次”a+aaaaa
?0 次或 1 次“可有可无一次”a?""a
{n}恰好 n 次固定次数a{3}aaa
{n,}至少 n 次下限a{2,}aaaaaa
{n,m}n 到 m 次范围a{2,4}aaaaaaaaa

3.2 懒惰量词表

默认是贪婪:尽可能多吃,加 ?懒惰:尽可能少吃(但仍要匹配成功)

贪婪懒惰示例字符串贪婪匹配懒惰匹配
**?<.*><a><b><a><b><a>
++?".+?""a" "b""a" "b"(尽量长)"a"(尽量短)
{n,m}{n,m}?a{2,4}?aaaaaaaaaa

3.3 修饰符 Flags

Flag含义常见名称作用
i忽略大小写ignoreCaseabc 匹配 ABC
m多行模式multiline^ $ 作用于每一行
s点号匹配换行dotAll. 可以匹配 \n
g全局查找global找到所有匹配(JS 常见)
uUnicode 模式unicode处理 Unicode 更正确(JS 常见)

四、正则表达式中小众但好用的表达式

在前面的元字符速查表中,大部分都是比较常用的,我们在这一节对一些小众但非常实用的方法进行详细介绍

(1) 捕获分组:例如提取年月日

  • 正则:(\d{4})-(\d{2})-(\d{2})
  • 字符串:2026-01-06
  • 捕获组:组1:2026、组2:01,组3:06

(2)非捕获分组

当你只是想用分组来配合量词/优先级,但不想占用捕获编号时,用它!比如上面这个日期分隔符可能是 -/,对于新手而言,肯定容易写成(\d{4})(-|/)(\d{2})(-|/)(\d{2}),这样有一个问题,就是分隔符根本不是我们关心的数据,却占了编号

所以正确的写法是:(\d{4})(?:-|/)(\d{2})(?:-|/)(\d{2}) 这样分组会更干净,分隔符不占编号却也能起到分组作用

(3) ^$

  • ^abc:必须以 abc 开头
  • abc$:必须以 abc 结尾
  • ^abc$:整行/整个字符串必须完全等于 abc

(4)单词边界 \b

单词边界 = 两侧字符的 “类型发生变化” 的位置,具体来说:\b 匹配的是这样一个位置:

  • 左边是 \w,右边是 \W
  • 或左边是 \W,右边是 \w

但是需要注意的是:\b 匹配的是位置,不是字符本身

  • \bcat\b 只匹配独立单词 cat
  • concatenate 不会匹配到 cat(因为 cat 不在单词边界)

(5) 前瞻 (?=...):例如匹配后面跟着 px 的数字(提取数值)→ \d+(?=px)16px → 匹配 16

(6)负前瞻 (?!...):例如匹配不是 .jpg 结尾的文件名,* ^.+\.(?!jpg$)\w+$

(7) 后顾 (?<=...):例如匹配 $ 后面的数字→ (?<=\$)\d+$199 → 匹配 199

(8)负后顾 (?<!...):例如匹配前面不是 # 的数字, (?<!#)\d+,以上四种前瞻后顾的方法,只匹配位置,不消耗字符

同时注意正则也有运算优先级,常见(从高到低):

  1. 括号 (...)
  2. 量词 * + ? {}(作用于前一个元素)
  3. 连接(挨着写)
  4. 选择 |

例如根据 连接>选择 | 的优先级规则,我们知道:

  • ab|cd 等价 (ab)|(cd)
  • a(b|c)d 才是你想要的 “abd 或 acd”

五、常用正则模板库

我们需要知道的是,正则没有“万能”,需要根据不同情境撰写规则,以下模板适合多数工程场景,可以收藏。

以下正则为 工程常用版本,默认单行匹配,必要时配合 ^ $ 使用
使用前请根据业务是否允许空值、前后空白进行微调,可以选择删除行首行尾匹配符

(1)数字 / 字符基础类

表达式用途表达式用途
^\d+$正整数^-?\d+$整数(含负数)
^\d{n}$固定 n 位数字^\d{m,n}$m 到 n 位数字
^\d+(\.\d+)?$数字或小数^\d+(\.\d{1,2})?$金额(最多 2 位小数)
^\d{6}$邮编^\d{4}$年份
^\d{2}$两位数字^\d+$纯数字字符串

(2)空白 / 文本处理类

表达式用途表达式用途
^\s+$全是空白^\s*行首空白
\s*$行尾空白\n换行
\s+多个空白[ \t]+空格或制表符

(3)字符 / 单词边界类

表达式用途表达式用途
\w+单词字符\W+非单词字符
\bword\b独立单词\Bword\B单词内部
\b\d+\b独立数字(?<!\w)\d+(?!\w)精确数字边界
[A-Za-z]+英文字母[A-Za-z0-9_]+标识符

(4)账号 / 身份 / 校验类

表达式用途表达式用途
^[A-Za-z]\w{5,19}$用户名^\w{6,20}$简单账号
^(?=.*[A-Za-z])(?=.*\d).{8,}$字母+数字密码^(?=.*\d)(?=.*[A-Z]).{8,}$强密码
^1[3-9]\d{9}$中国手机号^\+86\s?1[3-9]\d{9}$含区号手机号

(5)日期 / 时间类

表达式用途表达式用途
^\d{4}-\d{2}-\d{2}$日期(-分隔)^\d{4}/\d{2}/\d{2}$日期(/分隔)
^\d{2}:\d{2}:\d{2}$时间^\d{2}:\d{2}$分钟级

(6)提取 / 替换 / 日志分析类

表达式用途表达式用途
".*?"双引号内容'.*?'单引号内容
<[^>]+>HTML 标签<(\w+)[^>]*>.*?</\1>成对标签
\d+(?=px)提取 px 数值(?<=\$)\d+金额数字
\bERROR\b错误日志\bWARN\b警告日志

本期给大家系统总结了正则表达式的主要用法,但是还是得说一句,正则不是靠记忆,而是靠“查表 + 理解结构”,以上这些表,就是你写正则时最值得翻的那一页,我是不懂代码的杰瑞学长,我们下期再见!

如果觉得文章对你有帮助,欢迎点赞 + 收藏 + 关注,一起进步!

更多推荐