跳到主要内容
版本:3.2.17

正则表达式

正则表达式(Regular Expression,简称 Regex)是一种用于匹配、查找和替换文本的模式描述语言。在 Reqable 中,正则表达式广泛应用于搜索筛选、重写规则、内容替换等场景,也能通过工具箱中的正则表达式工具进行在线调试。

本文介绍正则表达式的基本概念、常用语法与实用范例,帮助你快速上手。

什么是正则表达式

普通文本匹配只能查找固定字符串,例如搜索 reqable.com。而正则表达式可以用一套规则描述一类文本,例如:

  • 匹配任意邮箱地址
  • 匹配以 https:// 开头的 URL
  • 提取 JSON 中某个字段的值
  • 批量替换请求参数或响应内容

一个正则表达式由普通字符和特殊字符(元字符)组成。普通字符按字面含义匹配,元字符则表达更灵活的匹配规则。

例如:

reqable\.com

可以匹配文本中的 reqable.com。其中 \. 表示匹配真正的点号,而不是“任意字符”。

再例如:

https?://[^\s]+

可以匹配 http://https:// 开头的链接。

提示

正则表达式的方言略有差异(如 JavaScript、Python、PCRE 等)。Reqable 中的正则能力以实际功能模块为准,编写规则后建议先用工具箱中的正则表达式工具验证。

基本语法

普通字符

字母、数字和大部分符号都按字面含义匹配。

表达式含义匹配示例
abc匹配文本 abcabc
123匹配文本 123123

元字符

元字符具有特殊含义,是正则表达式的核心。

元字符含义
.匹配除换行符以外的任意单个字符
^匹配字符串开头
$匹配字符串结尾
*前面的元素重复 0 次或多次
+前面的元素重复 1 次或多次
?前面的元素重复 0 次或 1 次
\|或关系,匹配左右任意一侧
()分组,并可捕获匹配内容
[]字符集,匹配其中任意一个字符
{}指定重复次数
\转义字符,取消元字符的特殊含义

转义

当需要匹配元字符本身时,需要在前面加 \ 进行转义。

表达式含义
\.匹配点号 .
\*匹配星号 *
\+匹配加号 +
\?匹配问号 ?
\( \)匹配圆括号
\\匹配反斜杠 \

字符集

用方括号 [] 定义可选字符范围。

表达式含义匹配示例
[abc]匹配 a、b 或 ca
[0-9]匹配 0 到 9 的数字7
[a-z]匹配小写字母m
[A-Z]匹配大写字母M
[a-zA-Z0-9]匹配字母或数字A9
[^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. 第 1 组:协议 httphttps
  2. 第 2 组:主机名
  3. 第 3 组:可选路径

在替换时,通常可以用 $1$2$3 引用对应分组。例如把:

key=12345

替换为:

key=api-$1

当匹配规则为 key=(\d+) 时,结果会变成:

key=api-12345

如果不需要捕获,仅用于分组,可使用非捕获分组:

(?:http|https)

或运算

使用 | 表示“或”:

GET|POST|PUT

可以匹配 GETPOSTPUT

结合分组后更清晰:

^(GET|POST|PUT)$

常用标志(Flags)

部分正则引擎支持标志位,常见如下:

标志含义
i忽略大小写
g全局匹配(查找所有结果,而非只找第一个)
m多行模式,使 ^$ 匹配每一行的开头和结尾
s点号 . 可匹配换行符

例如,开启 i 后,reqable 也能匹配 ReqableREQABLE

实用范例

1. 匹配 HTTP 方法

^(GET|POST|PUT|PATCH|DELETE|HEAD|OPTIONS)$

2. 匹配域名

^[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$

可匹配如 reqable.comapi.example.com

3. 匹配 URL

https?://[^\s"'<>]+

可匹配 httphttps 链接,直到遇到空白或常见分隔符为止。

4. 匹配 IP 地址(简化版)

\b\d{1,3}(\.\d{1,3}){3}\b

可匹配如 127.0.0.1192.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

编写建议

  1. 优先写清楚目标:先明确要匹配什么、不要匹配什么,再落成表达式。
  2. 善用非贪婪匹配:提取标签、引号内容时,优先使用 .*?,避免一次吞掉过多文本。
  3. 注意转义:点号、问号、括号、斜杠等在不同场景下可能需要转义。
  4. 尽量锚定边界:用 ^$\b 缩小匹配范围,减少误匹配。
  5. 先测再用于规则:在 Reqable 工具箱的正则表达式工具中验证通过后,再配置到搜索或重写规则中。
  6. 保持简单:能用包含、通配符解决的场景,不必强行使用复杂正则。

快速参考

需求表达式示例
任意字符(非换行).
一个或多个数字\d+
可选的 ss?
api 开头^api
.json 结尾\.json$
匹配 aba\|b
捕获数字(\d+)
非贪婪任意内容.*?
空白分隔的单词\S+

掌握以上基础后,就可以覆盖 Reqable 日常调试中绝大多数正则使用场景。更复杂的规则建议分步编写,并结合实际请求/响应内容反复验证。