正则表达式
我来给你整理一份正则表达式常用语法大全,按使用频率和功能分类,附带实战示例:
一、基础元字符(必须掌握)
| 元字符 |
含义 |
示例 |
匹配结果 |
. |
匹配任意单个字符(除换行符) |
a.c |
abc, a1c, a@c |
\ |
转义特殊字符 |
a\.c |
a.c 字面量 |
| |
或(选择) |
a|b |
a 或 b |
() |
分组捕获 |
(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] 第二位是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])$
|
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 '^[0-9]+$' file.txt
sed -n '/^[0-9]\+$/p' file.txt
awk '/^[0-9]+$/' file.txt
import re re.search(r'^\d+$', text)
|
七、常用正则速查表(在线调试推荐)
调试工具
常用组合技巧
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 的重复
|