一文搞懂正则表达式:从基础到进阶
本文最后更新于 2026年3月12日 下午
正则表达式(Regular Expression)是一种描述文本匹配规则的语法工具,由普通字符和具有特殊含义的元字符组成。通过构建特定的模式字符串,可以对文本进行匹配、提取、替换或验证,广泛应用于数据校验、文本处理和安全分析等场景。
在日常工作中,熟练掌握正则表达式可以大幅提升效率。尤其是在渗透测试过程中,面对海量日志或数据输入时,利用正则快速定位目标内容,能显著减少重复劳动。原本需要半小时完成的工作,几分钟就能搞定,效率拉满,甚至还能多出一点“摸鱼时间”。
举个例子:
1 | |
解释: 整行必须是 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 | |
\G 解释: 连续性匹配,当匹配到满足项后从该位置继续匹配,不满足就结束匹配。
1 | |
控制字符
| 元字符 | 含义 |
|---|---|
\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 | |
正则表达式分组与操作符(Operators)
| 表达式 | 含义 |
|---|---|
(pattern) |
捕获分组,将括号看成一个整体返回 |
(?:pattern) |
非捕获分组,匹配 pattern 但不获取匹配结果 |
(?=pattern) |
正向肯定预查(正向前瞻) |
(?!pattern) |
正向否定预查(负向前瞻) |
(?<=pattern) |
反向肯定预查(正向后顾) |
(?<!pattern) |
反向否定预查(负向后顾) |
(?=pattern) 和 (?!pattern) 解析:
1 | |
(?<=pattern) 和 (?<!pattern) 解析:
1 | |
配合 | {} 使用:
1 | |
正则表达式匹配模式(Mode)
模式修饰符(Flags)
| 标志 | 含义 |
|---|---|
i |
忽略大小写 |
m |
多行模式(^ 和 $ 按行匹配) |
s |
点号匹配换行(DOTALL) |
x |
允许空格和注释 |
行内修饰符(Inline Flags)
| 表达式 | 含义 |
|---|---|
(?i) |
开启忽略大小写 |
(?-i) |
关闭忽略大小写 |
(?i)abc |
全局模式,整个表达式生效 |
(?i:abc) |
局部模式,仅在括号内生效 |
(?s).* |
可以换匹配全部内容,包含存在换行的字符串 |
注意: (?i)abc 直接写表示全局模式(对整个表达式生效), (?i:abc) 为局部模式,仅在当前括号生效。
1 | |
常用正则表达式
匹配 URL:
1 | |
匹配 IP 地址:
1 | |
匹配邮箱:
1 | |
匹配中文:
1 | |
在线网站
1 | |
Thinks
以上内容已同步至 知识库 ,方便随时查阅,详情请访问下方链接:
1 | |
如果我的文章对您有帮助或您希望与我更多交流,欢迎点击「关于我」,通过页面中的微信公众号、邮箱或 Discord 与我联系;若您发现文章中存在任何错误或不足之处,也非常欢迎通过以上方式指出,在此一并致以衷心的感谢。 😊🫡
最后,祝您生活愉快!🌞✨