正则表达式速查表
正则表达式是文本处理的瑞士军刀,广泛用于 grep、sed、awk、vim、Python、JavaScript、Java 等工具和语言。本速查表按语法类别整理了从基础到高级的正则模式,涵盖字面量匹配、量词、分组与捕获、环视断言、标志位、替换引用以及不同风格的差异,每个语法点都有实际使用示例。
使用场景速查
| 你要做什么 | 用哪个模式 |
| 匹配数字 | \d+ 或 [0-9]+ |
| 匹配邮箱 | [\w.]+@\w+\.\w+ |
| 匹配 URL | https?://[\w./]+ |
| 提取括号内容 | \(([^)]+)\) |
| 替换前后文本 | (?<=before)text(?=after) |
| 忽略大小写 | /pattern/i 标志位 |
| 匹配行首行尾 | ^pattern$ |
字面量与字符类
``regex
# 字面量匹配
hello # 直接匹配 "hello" 字符串
abc123 # 匹配字母数字组合
a\.b # 转义点号(匹配 "a.b" 而不是任意字符)
a\\b # 匹配 "a\\b"(反斜杠需要双重转义)
# 字符类 [abc] # 匹配 a、b、c 中任意一个 [a-z] # 小写字母范围 [0-9] # 数字范围 [a-zA-Z0-9_] # 字母数字下划线 [^abc] # 排除 a、b、c(取反) [\s\S] # 匹配任意字符(包括换行)
# 预定义字符类 \d # 数字 [0-9] \D # 非数字 \w # 单词字符 [a-zA-Z0-9_] \W # 非单词字符 \s # 空白字符 [ \t\n\r\f\v] \S # 非空白字符 . # 匹配任意单个字符(默认不包含换行)
# 特殊字符转义
\. \* \\ \( \) \[ \] \+ \? \^ \$ # 元字符转义后匹配字面量
`
量词
`regex
# 基础量词
a* # 0 次或多次
a+ # 1 次或多次
a? # 0 次或 1 次(可选)
a{3} # 精确匹配 3 次
a{2,5} # 2 到 5 次
a{2,} # 至少 2 次
# 贪婪 vs 非贪婪 a.*b # 贪婪:匹配 a 到最后一个 b a.*?b # 非贪婪:匹配 a 到第一个 b a.+?b # 非贪婪:至少一个字符 a{2,5}? # 非贪婪:尽可能少匹配
# 实用示例
\d{3,4} # 3 或 4 位数字
\w+ # 一个或多个单词字符
https?:// # 匹配 http:// 或 https://
\.\w{2,4}$ # 匹配文件扩展名(2-4个字符)
`
分组与捕获
`regex
# 捕获组
(abc) # 捕获组 #1
(a)(b)(c) # 三个捕获组 #1, #2, #3
((a)(b)) # 嵌套捕获组 #1=ab, #2=a, #3=b
# 反向引用(同一模式内) (abc)\1 # 匹配 "abcabc"(\1 引用组 #1) <(\w+)>.*<\/\1> # 匹配 HTML 标签对:... (["'])\w+\1 # 匹配引号内的单词:"hello" 或 'hello'
# 非捕获组 (?:abc) # 分组但不捕获 (?:https?|ftp):// # 匹配协议前缀(http/ftp)
# 命名捕获组(PCRE/Python) (?Ppattern) # Python 命名捕获 (?pattern) # PCRE/JavaScript 命名捕获 \k # 引用命名捕获组
# 原子分组(禁止回溯)
(?>pattern) # 原子分组,匹配后不回溯
`
环视断言
`regex
# 前瞻断言
(?=pattern) # 肯定前瞻:后面跟着 pattern
(?!pattern) # 否定前瞻:后面不跟 pattern
# 后顾断言 (?<=pattern) # 肯定后顾:前面是 pattern (?
# 实用示例 (?<=\$)\d+ # 美元符号后的数字($100 -> 100) \w+(?=\s+is) # "is" 前面的单词 (?!admin)\w+ # 匹配不是 "admin" 的单词 (?
# 复杂环视组合
(?<=@)\w+(?=\.) # 邮箱中 @ 和 . 之间的部分
(?<=).*?(?=) # 提取标签之间的内容
`
标志位
`regex
# 常用标志
/i # 忽略大小写
/g # 全局匹配(查找所有匹配)
/m # 多行模式(^$ 匹配行首尾)
/s # 单行/DOTALL 模式(. 匹配换行)
/x # 宽松模式(忽略空格和注释)
/u # Unicode 支持
/y # 粘性匹配(从上次结束位置继续)
# 内联标志(模式内) (?i)abc # 从 (?i) 开始忽略大小写 (?i-m)abc # 启用忽略大小写,禁用多行 (?-i) # 关闭忽略大小写
# 组合示例
/^hello/i # 行首的 hello(忽略大小写)
/^hello/im # 每行行首的 hello
/hello.world/s # hello.world 跨行匹配
`
替换引用
`regex
# 替换语法
$1 $2 ... # 引用捕获组(多数语言/工具)
\1 \2 ... # 引用捕获组(sed、vim)
$& 或 \0 # 整个匹配的文本
$ 或 \ # 匹配前的文本
$' 或 \' # 匹配后的文本
# 实用替换 s/(\w+)@(\w+)/$1 at $2/g # "user@host" -> "user at host" s/(\d{4})-(\d{2})-(\d{2})/$2\/$3\/$1/ # 日期格式转换 2026-07-16 -> 07/16/2026 s/\b(\w)/\U$1/g # 每个单词首字母大写 s/\s+/ /g # 多个空格合并为一个
# 条件替换 s/foo/bar/ # 只替换第一个匹配 s/foo/bar/g # 替换所有匹配 s/(?<=,)\s+/ /g # 逗号后的空格缩为一个
# 大小写转换(部分工具支持)
\L...\E # 转小写(sed)
\U...\E # 转大写(sed)
\l \u # 下一个字符小写/大写
`
风格差异
`bash
# BRE(基本正则 - sed/grep 默认)
\(abc\) # 需要转义才能捕获
\{3\} # 需要转义才能用量词
a\+ # 需要转义才能匹配 1 次以上
a\|b # 需要转义才能用或
# ERE(扩展正则 - grep -E / sed -E) (abc) # 直接使用捕获组 {3} # 直接使用量词 a+ # 直接使用 + a|b # 直接使用或
# PCRE(Perl 兼容 - Python/JS/Java/PHP) \d+ # 预定义字符类 (?=) (?!) (?<=) (?
# grep 风格 grep 'pattern' file # 基本正则(BRE) grep -E 'pattern' file # 扩展正则(ERE) grep -P 'pattern' file # PCRE(如果支持) grep -o 'pattern' file # 只输出匹配部分
# sed 风格 sed 's/pattern/replacement/' # BRE sed -E 's/pattern/replacement/' # ERE sed -n 's/pattern/replacement/p' # 打印替换结果
# awk 风格 awk '/pattern/ {print}' # ERE 类似 awk '{ gsub(/pattern/, "repl"); print }' # 替换 ``
字面量与字符类(8)
| 命令 | 难度 | ||
|---|---|---|---|
.匹配任意单个字符(默认不包含换行) | 基础 | h.t matches hat, hot, hit | |
[abc]字符类 — 匹配集合中任意一个字符 | 基础 | [aeiou] matches any vowel | |
[^abc]否定字符类 — 匹配不在集合中的任意字符 | 基础 | [^0-9] matches any non-digit | |
\d / \w / \s预定义字符类 — 数字、单词字符、空白 | 基础 | \d+ matches one or more digits | |
\D / \W / \S预定义字符类的否定形式 | 基础 | \D+ matches one or more non-digits | |
\. \* \\ \( \)转义元字符 — 恢复字面含义 | 基础 | a\.b matches "a.b" exactly | |
^ $行首和行尾锚点 | 基础 | ^# matches lines starting with # (comments) | |
\b / \B单词边界和非单词边界断言 | 中级 | \bword\b matches whole word "word" only |
量词(4)
| 命令 | 难度 | ||
|---|---|---|---|
* / + / ?基础量词 — 零次或多次、一次或多次、零次或一次 | 基础 | https?:// matches both http:// and https:// | |
{n,m}区间量词 — 精确指定重复次数范围 | 中级 | \d{3,4} matches 3 or 4 digits | |
*? / +? / ??非贪婪(懒惰)量词 — 尽可能少匹配 | 中级 | a.*?b matches a to FIRST b | |
.* / .+任意字符重复 — 匹配任意长度的字符串 | 基础 | ".*?" matches shortest string between double quotes |
分组与捕获(5)
| 命令 | 难度 | ||
|---|---|---|---|
(pattern)捕获组 — 匹配并保存子串供后续引用 | 基础 | (abc)\1 matches "abcabc" | |
(?:pattern)非捕获组 — 仅分组而不保存匹配 | 中级 | (?:https?|ftp):// matches protocol prefix | |
\1 \2 $1 $2反向引用 — 引用之前捕获组的内容 | 中级 | <(\w+)>.*<\/\1> matches paired HTML tags | |
(?P<name>pattern)命名捕获组 — 按名称引用捕获内容 | 高级 | (?P<year>\d{4})-(?P<month>\d{2}) | |
(?>pattern)原子分组 — 匹配后不回溯 | 高级 | (?>a|ab)c matches "ac" but not "abc" |
环视断言(4)
| 命令 | 难度 | ||
|---|---|---|---|
(?=pattern)肯定前瞻 — 断言后面跟着指定模式 | 中级 | \w+(?=\s+is) matches word before "is" | |
(?!pattern)否定前瞻 — 断言后面不跟指定模式 | 中级 | (?!admin)\w+ matches any word except "admin" | |
(?<=pattern)肯定后顾 — 断言前面是指定模式 | 高级 | (?<=\$)\d+ matches digits after $ sign | |
(?<!pattern)否定后顾 — 断言前面不是指定模式 | 高级 | (?<!\d)\d{4}(?!\d) matches standalone 4-digit number |
标志位(5)
| 命令 | 难度 | ||
|---|---|---|---|
/i忽略大小写标志 | 基础 | /^hello/i matches "Hello", "HELLO", "hello" | |
/g全局匹配标志(查找所有匹配) | 基础 | /\d+/g finds all numbers in a string | |
/m多行模式标志(^$ 匹配行首尾) | 中级 | /^hello/m matches hello at start of any line | |
/s单行模式标志(. 匹配换行符) | 中级 | /hello.world/s matches across lines | |
(?i) inline flag内联标志 — 在模式中启用/禁用标志 | 高级 | (?i)hello(?-i) world makes only hello case-insensitive |
替换引用(3)
| 命令 | 难度 | ||
|---|---|---|---|
$1 / \1 backreference反向引用替换 — 在替换字符串中引用捕获组 | 中级 | s/(\w+)@(\w+)/$1 at $2/ transforms "user@host" | |
$& $MATCH $PREMATCH特殊替换变量 — 整个匹配、匹配前/后文本 | 中级 | s/\w+/[$&]/ wraps each word in brackets | |
\U / \L / \u / \l大小写转换替换(sed 等工具) | 高级 | s/\b(\w)/\U$1/ uppercases first letter of each word |
风格差异(3)
| 命令 | 难度 | ||
|---|---|---|---|
BRE -- \( \) \{ \}基本正则表达式(BRE)— 元字符需要转义 | 中级 | sed 's/\(abc\)/\1def/' uses escaped groups | |
ERE -- ( ) { } + |扩展正则表达式(ERE)— 元字符直接使用 | 中级 | grep -E 'https?://' uses ERE | |
PCRE -- \d \s \b (?=)Perl 兼容正则(PCRE)— 最丰富的功能集 | 中级 | grep -P '\b\w+(?=\s+is)' uses PCRE lookahead |