一文搞懂正则表达式:从基础到进阶

本文最后更新于 2026年3月12日 下午

正则表达式(Regular Expression)是一种描述文本匹配规则的语法工具,由普通字符和具有特殊含义的元字符组成。通过构建特定的模式字符串,可以对文本进行匹配、提取、替换或验证,广泛应用于数据校验、文本处理和安全分析等场景。

在日常工作中,熟练掌握正则表达式可以大幅提升效率。尤其是在渗透测试过程中,面对海量日志或数据输入时,利用正则快速定位目标内容,能显著减少重复劳动。原本需要半小时完成的工作,几分钟就能搞定,效率拉满,甚至还能多出一点“摸鱼时间”。

举个例子:

1
^[0-9]+F0ne$

解释: 整行必须是 1个或多个数字 + F0ne 。这里的 ^ $ 均属于元字符, [] + 属于运算符。0-9 和 F0ne 分别表示数字和字符串原始字义。通过这些组合就可以在大量数据中找到满足表达式的字符串。

正则表达式元字符(Metacharacters)

元字符用于表示字符集合或具有特殊含义的字符。

常用字符类

元字符 含义
. 匹配任意单个字符
\w 单词字符(字母、数字、下划线)
\W 非单词字符(特殊符号类)
\d 数字字符
\D 非数字字符
\s 空白字符(空格、tab、换行等)
\S 非空白字符

边界与位置匹配类

元字符 含义
^ 匹配行首
$ 匹配行尾
\A 匹配开头(不受多行影响)
\Z 匹配末尾(不受多行影响,最后可有换行)
\z 绝对匹配末尾(不受多行影响,最后换行都不能有)
\b 匹配单词边界
\B 匹配非单词边界
\G 上次匹配结束位置

^ $ \A \Z \z 解释: 基于边界的匹配。

^ / $ 默认匹配整个输入的开始/结束;当开启多行模式(如 m)时,^ / $ 才会匹配每一行的行首/行尾。但是有时候想要全篇匹配,就需要 \A \Z 精确的匹配开头和结尾,而 \z 则在结尾处要求更严格,即使结尾多一个换行符也不行。

\b \B 解释: 基于单词的匹配。

1
2
3
4
5
6
7
8
9
10
11
# 示例 1
hello world

# 示例 2
helloworld

# 正则
hello\b # 可以匹配到示例 1 中的hello

# 正则
hello\B # 可以匹配到示例 2 中的hello

\G 解释: 连续性匹配,当匹配到满足项后从该位置继续匹配,不满足就结束匹配。

1
2
3
4
5
6
7
8
9
10
11
# 示例 1
123-123

# 示例 2
123123

# 正则
\d+ # 在示例 1 和示例 2 都可以完成匹配所有数字

# 正则
\G\d+ # 在示例 1 只能匹配第一个123,示例 2 可以全部匹配

控制字符

元字符 含义
\n 换行符
\r 回车符
\t 制表符
\f 换页符
\a 响铃符
\e ESC 字符

Unicode 支持(高级)

不太常用可以了解一下。

元字符 含义
\uhhhh 16 进制 Unicode 字符
\Uhhhhhhhh 8 位 Unicode 字符
\xhh 2 位 16 进制字符
\x{hhhh} 可变长度 Unicode
\p{X} 匹配指定 Unicode 属性
\P{X} 非指定 Unicode 属性
\N{name} 匹配命名 Unicode 字符
\X 字素簇(Grapheme Cluster)

其他特殊字符

不太常用可以了解一下。

元字符 含义
\Q...\E 将内容转为字面量
\k 命名反向引用
\0ooo 八进制字符

正则表达式字符集合(Set Expressions)

表示一个集合内容。

表达式 含义
[abc] 匹配 a、b、c 任一字符
[^abc] 排除字符集 a、b、c
[A-Z] 范围匹配 A-Z
[\u0000-\U0010ffff] 所有 Unicode 字符

正则表达式量词(Quantifiers)

用于控制匹配次数。

贪婪量词(默认)

在能匹配成功的前提下尽量多匹配。

表达式 含义
* 0 次或多次匹配
+ 1 次或多次匹配
? 0 或 1 次匹配
{n} 恰好匹配 n 次
{n,} 至少匹配 n 次
{n,m} n 到 m 次匹配
.* 匹配任意字符(除了换行)

非贪婪量词(Lazy)

在能匹配成功的前提下尽量少匹配。

表达式 含义
*? 最少匹配 0 次
+? 最少匹配 1 次
?? 0 或 1 次匹配,优先 0 次
{n,m}? 在范围内最大程度少匹配
.*? 最大程度少匹配

占有型量词(Possessive)

占有型可以理解为 贪婪 + 锁死回溯回溯: 正则匹配失败后,往回退一步重新匹配。

表达式 含义
*+ 匹配 0 次或多次,并且一旦匹配就不回溯
++ 匹配 1 次或多次,并且一旦匹配就不回溯
?+ 匹配 0 或 1 次,并且一旦选择就不回溯
{n,m}+ 匹配 n~m 次(通常先按贪婪取尽可能多),并且不回溯
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
# 例子
aacc

# 贪婪模式正则 1
a.*c # 结果为:aacc,.* 任意非换行字符任意次,所以全部匹配
# 贪婪模式正则 2
a+c # 结果为:aac
# 贪婪模式正则 3
a?c # 结果为:ac
# 贪婪模式正则 4
a{0,2}c # 结果为:aac,按最大匹配


# 非贪婪模式正则 1
a*?c # 结果为: aac,先尝试匹配 0 个 a,失败;再尝试 1 个 a,失败;再尝试 2 个 a,成功,因此匹配结果为 aac
# 非贪婪模式正则 2
a+?c # 结果为: aac,这里最少匹配一个 a
# 非贪婪模式正则 3
a??c # 结果为: ac,这里如果将例子改为 caacc,这结果为 c,默认先尝试 0 个 a,刚好找到 c 就停止了
# 非贪婪模式正则 4
a{0,1}?c # 结果为: ac,{0,1}? 等价于 ??

# 占有型模式正则 1
a*+c # 结果为:aac,首先贪婪匹配 aa,锁死不回溯然后匹配第一个 c,得到aac
# 占有型模式正则 2
a++c # 结果依然是aac,因为它会默认先贪婪匹配所有 a,然后在匹配 c
# 占有型模式正则 3
a?+c # 结果为:ac,注意:不回溯不是只进行一轮匹配,而是每个字符向下匹配,最终匹配到 ac
# 占有型模式正则 4
a{2,4}+c # 结果为:aac,这里和贪婪和非贪婪模式得到的结果一致

# 一些对比
{n,m} # 贪婪(尽量多,失败会回溯)
{n,m}? # 非贪婪(尽量少,不够再加)
{n,m}+ # 占有型(尽量多,但不回溯)

正则表达式分组与操作符(Operators)

表达式 含义
(pattern) 捕获分组,将括号看成一个整体返回
(?:pattern) 非捕获分组,匹配 pattern 但不获取匹配结果
(?=pattern) 正向肯定预查(正向前瞻)
(?!pattern) 正向否定预查(负向前瞻)
(?<=pattern) 反向肯定预查(正向后顾)
(?<!pattern) 反向否定预查(负向后顾)

(?=pattern)(?!pattern) 解析:

1
2
3
4
5
6
7
8
9
10
11
# 例子
Windows95
Windows3.1

# (?=pattern) 正则
Windows(?=95|98|NT|2000)
# 匹配满足 Windows 后面包含括号内的字符,输出 Windows(Windows95)

# (?!pattern) 正则
Windows(?!95|98|NT|2000)
# 匹配不满足 Windows 后面包含括号内的字符,输出 Windows(Windows3.1)

(?<=pattern)(?<!pattern) 解析:

1
2
3
4
5
6
7
8
9
10
11
# 例子
2000Windows
3.1Windows

# (?<=pattern) 正则
(?<=95|98|NT|2000)Windows
# 匹配满足 Windows 前面包含括号内的字符,输出 Windows(2000Windows)

# (?<!pattern) 正则
(?<!95|98|NT|2000)Windows
# 匹配不满足 Windows 前面包含括号内的字符,输出 Windows(3.1Windows)

配合 | {} 使用:

1
2
3
4
5
6
7
8
# 通过 | 实现多个选项匹配
# 例子
a123
aa123
ab123

# 匹配 abc 字符中任意两个 + 123
(a|b|c){2}123 # 可以匹配到 aa123 和 ab123

正则表达式匹配模式(Mode)

模式修饰符(Flags)

标志 含义
i 忽略大小写
m 多行模式(^ 和 $ 按行匹配)
s 点号匹配换行(DOTALL)
x 允许空格和注释

行内修饰符(Inline Flags)

表达式 含义
(?i) 开启忽略大小写
(?-i) 关闭忽略大小写
(?i)abc 全局模式,整个表达式生效
(?i:abc) 局部模式,仅在括号内生效
(?s).* 可以换匹配全部内容,包含存在换行的字符串

注意: (?i)abc 直接写表示全局模式(对整个表达式生效), (?i:abc) 为局部模式,仅在当前括号生效。

1
2
3
4
5
# abc 忽略大小写,def 必须小写
(?i)abc(?-i)def
(?i)abc(?-i:def)
# 也可以多个修饰符一起用
(?im)^abc

常用正则表达式

匹配 URL:

1
2
3
4
# URL + 请求资源
(https?|ftp|file)://[-A-Za-z0-9+&@#/%?=~_|!:,.;]+[-A-Za-z0-9+&@#/%=~_|]
# URL
[A-Za-z]+://[^\s]*

匹配 IP 地址:

1
2
3
4
5
6
7
8
# 0-255.0-255.0-255.0-255
^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$

# 1-255.0-255.0-255.1-255
(?<!\d)((25[0-5]|2[0-4]\d|1\d\d|[1-9])\.)((25[0-5]|2[0-4]\d|1\d\d|\d)\.){2}(25[0-5]|2[0-4]\d|1\d\d|[1-9])(?!\d)

# 注意:添加 ^$是为了完整匹配,仅允许匹配行必须为IP地址
# (?<!\d) 和 (?!\d) 是为了断言匹配,意指 IP 地址的前后不能有数字

匹配邮箱:

1
[\w!#$%&'*+/=?^_`{|}~-]+(?:\.[\w!#$%&'*+/=?^_`{|}~-]+)*@(?:[\w](?:[\w-]*[\w])?\.)+[\w](?:[\w-]*[\w])?

匹配中文:

1
[\u4e00-\u9fa5]

在线网站

1
2
https://regexr.com/
https://tool.oschina.net/regex

Thinks

以上内容已同步至 知识库 ,方便随时查阅,详情请访问下方链接:

1
https://f0nesec.github.io/f0nesec-docs/Certifications/OSWE/0/

如果我的文章对您有帮助或您希望与我更多交流,欢迎点击「关于我」,通过页面中的微信公众号、邮箱或 Discord 与我联系;若您发现文章中存在任何错误或不足之处,也非常欢迎通过以上方式指出,在此一并致以衷心的感谢。 😊🫡

最后,祝您生活愉快!🌞✨


一文搞懂正则表达式:从基础到进阶
https://www.f0nesec.top/2026/02/28/oswe-regex/
作者
F0ne
发布于
2026年2月28日
许可协议