正则表达式一览
正则表达式(regex)是定义搜索模式的字符序列。相同的语法适用于 JavaScript、Python、Go、Java、PHP、Ruby 以及大多数现代语言——仅存在细微的方言差异。
学会正则表达式一次,你就能在编辑器查找替换、grep 和 sed 等命令行工具、日志分析管道、表单验证以及数据提取脚本中随处使用。

锚点
锚点不匹配字符——它们匹配位置。
| 模式 | 匹配 |
|---|---|
^ |
字符串开头(多行模式下为行开头) |
$ |
字符串结尾(多行模式下为行结尾) |
\b |
单词边界(\w 和 \W 之间) |
\B |
非单词边界 |
^hello 匹配 "hello world" 但不匹配 "say hello"
world$ 匹配 "hello world" 但不匹配 "worldwide"
\bcat\b 匹配 "cat" 但不匹配 "concatenate"
字符类
| 模式 | 匹配 |
|---|---|
. |
除换行符外的任意字符 |
\d |
数字:[0-9] |
\D |
非数字:[^0-9] |
\w |
单词字符:[a-zA-Z0-9_] |
\W |
非单词字符 |
\s |
空白字符:空格、制表符、换行符 |
\S |
非空白字符 |
[abc] |
a、b 或 c |
[^abc] |
除 a、b、c 之外的任意字符 |
[a-z] |
任意小写字母 |
[A-Za-z0-9] |
字母数字 |
量词
| 模式 | 含义 |
|---|---|
* |
0 次或多次 |
+ |
1 次或多次 |
? |
0 次或 1 次(可选) |
{n} |
恰好 n 次 |
{n,} |
n 次或更多 |
{n,m} |
n 到 m 次之间 |
*? |
0 次或多次,懒惰(非贪婪) |
+? |
1 次或多次,懒惰 |
贪婪 vs 懒惰:默认情况下,量词是贪婪的——它们尽可能多地匹配。添加 ? 使其懒惰——它们尽可能少地匹配。
输入:<b>bold</b> and <i>italic</i>
贪婪 <.*> 匹配整个字符串
懒惰 <.*?> 分别匹配 <b>、</b>、<i>、</i>
分组与选择
| 模式 | 含义 |
|---|---|
(abc) |
捕获分组 |
(?:abc) |
非捕获分组 |
(?<name>abc) |
命名捕获分组 |
| `a | b` |
\1 |
对分组 1 的反向引用 |
命名分组使复杂模式更易读:
(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})
匹配 2026-05-21,并允许你访问 match.groups.year、match.groups.month、match.groups.day。
前瞻与后顾
这些断言某个位置之前或之后的内容,但不将其包含在匹配中:
| 模式 | 含义 |
|---|---|
(?=abc) |
正向前瞻:后面跟着 abc |
(?!abc) |
负向前瞻:后面不跟着 abc |
(?<=abc) |
正向后顾:前面是 abc |
(?<!abc) |
负向后顾:前面不是 abc |
\d+(?= dollars) 匹配 "100 dollars" 中的 "100",但不匹配 "100 euros"
(?<=\$)\d+ 匹配美元符号后的数字

标志
| 标志 | 效果 |
|---|---|
g |
全局——查找所有匹配,而非仅第一个 |
i |
不区分大小写 |
m |
多行——^ 和 $ 匹配行边界 |
s |
点号通配——点号也匹配换行符 |
u |
Unicode 模式 |
真实世界模式
电子邮件地址(实用)
^[a-zA-Z0-9._%+\-]+@[a-zA-Z0-9.\-]+\.[a-zA-Z]{2,}$
覆盖绝大多数真实电子邮件地址。注意:完整的 RFC 5321 规范允许大多数真实世界电子邮件从不使用的字符。此模式有意拒绝边缘情况。
URL
https?://[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,}(/[\w\-\./\?\=\&\#\%]*)?
IPv4 地址
^((25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d)\.){3}(25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d)$
验证每个八位字节为 0–255,拒绝 999.0.0.1。

ISO 日期(YYYY-MM-DD)
^\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01])$
十六进制颜色代码
^#([a-fA-F0-9]{6}|[a-fA-F0-9]{3})$
信用卡号(基本格式检查)
^(?:4\d{12}(?:\d{3})?|5[1-5]\d{14}|3[47]\d{13}|6(?:011|5\d{2})\d{12})$
匹配 Visa、Mastercard、Amex、Discover 格式。不通过 Luhn 算法验证。
密码(至少 8 个字符,需要字母和数字)
^(?=.*[A-Za-z])(?=.*\d)[A-Za-z\d@$!%*#?&]{8,}$
Slug(URL 安全字符串)
^[a-z0-9]+(?:-[a-z0-9]+)*$
常见错误
忘记转义点号:在正则中,. 匹配任意字符。要匹配字面句点,请写 \.。模式 myfile.txt 会匹配 myfileXtxt——通常不是你想要的。
灾难性回溯:嵌套量词如 (a+)+ 在某些输入上可能导致指数级时间。避免多个量词可以匹配相同字符的模式。
验证模式未锚定:没有 ^ 和 $,像 \d{4} 这样的模式会匹配输入中任意位置的四位数字子串——它不会拒绝 abc1234def。
需要懒惰时使用了贪婪匹配:提取标签间内容时,贪婪的 <.*> 会从第一个开标签抓取到最后一个闭标签。应改用 <.*?>。
测试你的模式
→ 使用 Regex Tester 编写和测试模式,支持实时高亮、捕获组检查和匹配详情。
→ Regex Cheat Sheet 提供常见模式的快速参考卡,全部在一个可滚动视图中。