正则表达式

我来给你整理一份正则表达式常用语法大全,按使用频率和功能分类,附带实战示例:

一、基础元字符(必须掌握)

元字符 含义 示例 匹配结果
. 匹配任意单个字符(除换行符) a.c abc, a1c, a@c
\ 转义特殊字符 a\.c a.c 字面量
| 或(选择) a|b ab
() 分组捕获 (ab)+ ab, abab, ababab
[] 字符类(匹配其中一个) [aeiou] a, e, i, o, u
[^] 否定字符类 [^0-9] 非数字的任意字符
- 范围(在字符类中) [a-z] 任意小写字母

二、量词(重复匹配)

量词 含义 示例 匹配结果
* 0次或多次(贪婪) a* "", a, aa, aaa
+ 1次或多次(贪婪) a+ a, aa, aaa
? 0次或1次(贪婪) a? "", a
{n} 恰好 n 次 a{3} aaa
{n,} 至少 n 次 a{2,} aa, aaa, aaaa
{n,m} n 到 m 次 a{2,4} aa, aaa, aaaa
*? 0次或多次(非贪婪/懒惰) a*? ""(尽可能少)
+? 1次或多次(非贪婪) a+? a(尽可能少)
?? 0次或1次(非贪婪) a?? ""

贪婪 vs 非贪婪对比

1
2
3
4
字符串:<div>hello</div><span>world</span>

贪婪:<.*> → 匹配整个 "<div>hello</div><span>world</span>"
非贪婪:<.*?> → 匹配 "<div>"(第一次匹配)

三、位置锚点(边界匹配)

锚点 含义 示例 匹配结果
^ 行首 ^Hello 以 Hello 开头的行
$ 行尾 world$ 以 world 结尾的行
\b 单词边界 \bcat\b 独立单词 cat,不匹配 category
\B 非单词边界 \Bcat\B 匹配 cat 在单词内部
\A 字符串开头(多行模式) \AHello 整个字符串开头
\Z 字符串结尾(多行模式) world\Z 整个字符串结尾
(?=...) 正向前瞻 \d(?=px) 匹配后面跟 px 的数字
(?!...) 负向前瞻 \d(?!px) 匹配后面不跟 px 的数字
(?<=...) 正向后顾 (?<=\$)\d+ 匹配 $ 后面的数字
(?<!...) 负向后顾 (?<!\$)\d+ 匹配不是 $ 后面的数字

四、常用字符类(快捷写法)

写法 含义 等价于
\d 数字 [0-9]
\D 非数字 [^0-9]
\w 单词字符(字母、数字、下划线) [a-zA-Z0-9_]
\W 非单词字符 [^a-zA-Z0-9_]
\s 空白字符(空格、制表符、换行等) [ \t\n\r\f\v]
\S 非空白字符 [^ \t\n\r\f\v]
\t 制表符 -
\n 换行符 -
\r 回车符 -

五、实际应用场景示例

1. 手机号验证(中国大陆)

1
^1[3-9]\d{9}$
  • ^ 开头,$ 结尾
  • 1 以1开头
  • [3-9] 第二位是3-9
  • \d{9} 后面9位数字

2. 邮箱验证

1
^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$
  • 用户名:字母数字 . _ % + -
  • @ 符号
  • 域名:字母数字 . -
  • 顶级域名:2位以上字母

3. IPv4 地址

1
^((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)$
  • 25[0-5]:250-255
  • 2[0-4]\d:200-249
  • [01]?\d\d?:0-199

4. URL 匹配

1
^https?://[^\s/$.?#].[^\s]*$
  • https?:http 或 https
  • ://:协议分隔符
  • [^\s/$.?#]:域名首字符不能是特殊符号
  • [^\s]*:后面任意非空格字符

5. 日期格式(YYYY-MM-DD)

1
^\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01])$
  • 年:4位数字
  • 月:01-12
  • 日:01-31

6. 提取 HTML 标签内容

1
<([a-zA-Z]+)[^>]*>(.*?)</\1>
  • ([a-zA-Z]+):捕获标签名
  • [^>]*:标签属性
  • (.*?):非贪婪匹配内容
  • </\1>:匹配闭合标签(\1 引用第一个捕获组)

7. 密码强度验证(至少8位,含大小写字母和数字)

1
^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)[a-zA-Z\d]{8,}$
  • (?=.*[a-z]):至少一个小写字母
  • (?=.*[A-Z]):至少一个大写字母
  • (?=.*\d):至少一个数字

六、不同语言/工具的正则差异

特性 grep sed awk Python JavaScript Java
默认模式 基本正则 基本正则 基本正则 完整 完整 完整
扩展正则需要 -E -r 不支持 默认 默认 默认
前瞻/后顾 ✅(有限)
非贪婪 *?
\d 简写

示例差异:

1
2
3
4
5
6
7
8
9
10
11
12
# grep 使用(需要 -E 启用扩展正则)
grep -E '^[0-9]+$' file.txt

# sed 使用
sed -n '/^[0-9]\+$/p' file.txt # 需要转义 +

# awk 使用
awk '/^[0-9]+$/' file.txt

# Python
import re
re.search(r'^\d+$', text)

七、常用正则速查表(在线调试推荐)

调试工具

  • 在线测试regex101.com(支持多种语言)
  • 可视化regexper.com(生成流程图)
  • 命令行grep -P(Perl 正则)

常用组合技巧

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 1. 匹配中文
[\u4e00-\u9fa5]

# 2. 匹配空白行
^\s*$

# 3. 匹配 16 进制颜色
#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})

# 4. 匹配时间 HH:MM:SS
([01]\d|2[0-3]):[0-5]\d:[0-5]\d

# 5. 匹配文件名(带扩展名)
[^\\/]+\.[a-zA-Z0-9]+

# 6. 匹配引号内的内容(非贪婪)
"([^"]*)"

# 7. 匹配注释(单行)
//.*?$

# 8. 匹配连续重复字符
(.)\1+

八、常见错误和陷阱

❌ 错误示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 1. 忘记转义特殊字符
[a-z].com # 错误:. 会被当作任意字符
[a-z]\.com # 正确

# 2. 贪婪匹配导致意外
<.*> # 可能匹配太多
<.*?> # 使用非贪婪

# 3. 字符类中的特殊字符
[a-z-] # - 在末尾表示字面量
[-a-z] # - 在开头表示字面量
[a\-z] # 转义更明确

# 4. 量词作用范围错误
abc+ # 只匹配 c 的重复
(abc)+ # 匹配整个 abc 的重复