正则表达式
正则表达式(Regular Expression,简称 Regex)是一种用于匹配、查找和替换文本的模式描述语言。在 Reqable 中,正则表达式广泛应用于搜索筛选、重写规则、内容替换等场景,也能通过工具箱中的正则表达式工具进行在线调试。
本文介绍正则表达式的基本概念、常用语法与实用范例,帮助你快速上手。
什么是正则表达式
普通文本匹配只能查找固定字符串,例如搜索 reqable.com。而正则表达式可以用一套规则描述一类文本,例如:
- 匹配任意邮箱地址
- 匹配以
https://开头的 URL - 提取 JSON 中某个字段的值
- 批量替换请求参数或响应内容
一个正则表达式由普通字符和特殊字符(元字符)组成。普通字符按字面含义匹配,元字符则表达更灵活的匹配规则。
例如:
reqable\.com
可以匹配文本中的 reqable.com。其中 \. 表示匹配真正的点号,而不是“任意字符”。
再例如:
https?://[^\s]+
可以匹配 http:// 或 https:// 开头的链接。
正则表达式的方言略有差异(如 JavaScript、Python、PCRE 等)。Reqable 中的正则能力以实际功能模块为准,编写规则后建议先用工具箱中的正则表达式工具验证。
基本语法
普通字符
字母、数字和大部分符号都按字面含义匹配。
| 表达式 | 含义 | 匹配示例 |
|---|---|---|
abc | 匹配文本 abc | abc |
123 | 匹配文本 123 | 123 |
元字符
元字符具有特殊含义,是正则表达式的核心。
| 元字符 | 含义 |
|---|---|
. | 匹配除换行符以外的任意单个字符 |
^ | 匹配字符串开头 |
$ | 匹配字符串结尾 |
* | 前面的元素重复 0 次或多次 |
+ | 前面的元素重复 1 次或多次 |
? | 前面的元素重复 0 次或 1 次 |
\| | 或关系,匹配左右任意一侧 |
() | 分组,并可捕获匹配内容 |
[] | 字符集,匹配其中任意一个字符 |
{} | 指定重复次数 |
\ | 转义字符,取消元字符的特殊含义 |
转义
当需要匹配元字符本身时,需要在前面加 \ 进行转义。
| 表达式 | 含义 |
|---|---|
\. | 匹配点号 . |
\* | 匹配星号 * |
\+ | 匹配加号 + |
\? | 匹配问号 ? |
\( \) | 匹配圆括号 |
\\ | 匹配反斜杠 \ |
字符集
用方括号 [] 定义可选字符范围。
| 表达式 | 含义 | 匹配示例 |
|---|---|---|
[abc] | 匹配 a、b 或 c | a |
[0-9] | 匹配 0 到 9 的数字 | 7 |
[a-z] | 匹配小写字母 | m |
[A-Z] | 匹配大写字母 | M |
[a-zA-Z0-9] | 匹配字母或数字 | A、9 |
[^0-9] | 匹配非数字字符 | a、_ |
预定义字符类
| 表达式 | 含义 |
|---|---|
\d | 数字,等价于 [0-9] |
\D | 非数字,等价于 [^0-9] |
\w | 单词字符,等价于 [A-Za-z0-9_] |
\W | 非单词字符 |
\s | 空白字符(空格、制表符、换行等) |
\S | 非空白字符 |
量词
量词用于指定前面元素的重复次数。
| 表达式 | 含义 |
|---|---|
a* | a 出现 0 次或多次 |
a+ | a 出现 1 次或多次 |
a? | a 出现 0 次或 1 次 |
a{3} | a 恰好出现 3 次 |
a{2,4} | a 出现 2 到 4 次 |
a{2,} | a 至少出现 2 次 |
默认情况下,量词是贪婪的,会尽可能多地匹配。在量词后加 ? 可变为非贪婪(惰性)匹配:
| 表达式 | 含义 |
|---|---|
.* | 贪婪匹配尽可能长的内容 |
.*? | 非贪婪匹配尽可能短的内容 |
例如,对文本 <a>1</a><a>2</a>:
<a>.*</a>会匹配整段<a>1</a><a>2</a><a>.*?</a>会先匹配较短的<a>1</a>
锚点
| 表达式 | 含义 |
|---|---|
^ | 匹配行首或字符串开头 |
$ | 匹配行尾或字符串结尾 |
\b | 单词边界 |
\B | 非单词边界 |
例如:
^https匹配以https开头的字符串\.com$匹配以.com结尾的字符串\bapi\b匹配独立单词api,不会匹配apikey
分组与捕获
圆括号 () 用于分组,同时也能捕获匹配结果,便于后续引用或替换。
(https?)://([^/\s]+)(/[^\s]*)?
含义:
- 第 1 组:协议
http或https - 第 2 组:主机名
- 第 3 组:可选路径
在替换时,通常可以用 $1、$2、$3 引用对应分组。例如把:
key=12345
替换为:
key=api-$1
当匹配规则为 key=(\d+) 时,结果会变成:
key=api-12345
如果不需要捕获,仅用于分组,可使用非捕获分组:
(?:http|https)
或运算
使用 | 表示“或”:
GET|POST|PUT
可以匹配 GET、POST 或 PUT。
结合分组后更清晰:
^(GET|POST|PUT)$
常用标志(Flags)
部分正则引擎支持标志位,常见如下:
| 标志 | 含义 |
|---|---|
i | 忽略大小写 |
g | 全局匹配(查找所有结果,而非只找第一个) |
m | 多行模式,使 ^ 和 $ 匹配每一行的开头和结尾 |
s | 点号 . 可匹配换行符 |
例如,开启 i 后,reqable 也能匹配 Reqable、REQABLE。
实用范例
1. 匹配 HTTP 方法
^(GET|POST|PUT|PATCH|DELETE|HEAD|OPTIONS)$
2. 匹配域名
^[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$
可匹配如 reqable.com、api.example.com。
3. 匹配 URL
https?://[^\s"'<>]+
可匹配 http 或 https 链接,直到遇到空白或常见分隔符为止。
4. 匹配 IP 地址(简化版)
\b\d{1,3}(\.\d{1,3}){3}\b
可匹配如 127.0.0.1、192.168.1.1。注意这是简化写法,不会严格校验每个段是否小于等于 255。
5. 匹配邮箱
[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}
6. 匹配手机号(中国大陆,简化版)
^1[3-9]\d{9}$
7. 提取 Query 参数值
假设 URL 为:
https://reqable.com?key=12345&foo=bar
提取 key 的值:
[?&]key=([^&]*)
第 1 个捕获组即为 12345。
8. 匹配 JSON 字段值
假设文本为:
{"token":"abc123","expired":false}
提取 token 的值:
"token"\s*:\s*"([^"]*)"
第 1 个捕获组即为 abc123。
用正则解析复杂 JSON 并不稳健。结构简单时可临时使用,复杂场景建议使用 JSON 解析工具。
9. 匹配请求头中的 Authorization
(?i)^Authorization:\s*Bearer\s+(\S+)
可忽略大小写匹配 Authorization: Bearer xxx,并捕获 Token。
10. 替换示例:给参数值加前缀
原始文本:
key=12345&foo=bar
匹配:
key=([^&]*)
替换为:
key=api-$1
结果:
key=api-12345&foo=bar
编写建议
- 优先写清楚目标:先明确要匹配什么、不要匹配什么,再落成表达式。
- 善用非贪婪匹配:提取标签、引号内容时,优先使用
.*?,避免一次吞掉过多文本。 - 注意转义:点号、问号、括号、斜杠等在不同场景下可能需要转义。
- 尽量锚定边界:用
^、$、\b缩小匹配范围,减少误匹配。 - 先测再用于规则:在 Reqable 工具箱的正则表达式工具中验证通过后,再配置到搜索或重写规则中。
- 保持简单:能用包含、通配符解决的场景,不必强行使用复杂正则。
快速参考
| 需求 | 表达式示例 |
|---|---|
| 任意字符(非换行) | . |
| 一个或多个数字 | \d+ |
可选的 s | s? |
以 api 开头 | ^api |
以 .json 结尾 | \.json$ |
匹配 a 或 b | a\|b |
| 捕获数字 | (\d+) |
| 非贪婪任意内容 | .*? |
| 空白分隔的单词 | \S+ |
掌握以上基础后,就可以覆盖 Reqable 日常调试中绝大多数正则使用场景。更复杂的规则建议分步编写,并结合实际请求/响应内容反复验证。