发布于2026-07-23 阅读(0)
扫一扫,手机访问
聊到JMeter正则表达式,这里有个关键点必须搞清楚:它本质上是帮我们从服务器响应里“捞”数据的工具。不管你是做接口测试还是性能测试,总会遇到上个请求的回包内容要往下个请求传的场景——这时候就得靠正则表达式来精准定位、提取那些动态数据了。

简单说,JMeter里的正则表达式就是一种文本匹配机制,用来从服务器返回的响应中定位并捕获特定字符串。你定义好一个搜索模式,它就去响应里找匹配的内容。这项能力在关联测试中尤其关键——很多动态数据的提取,都离不了它。
在JMeter里添加正则表达式提取器,操作路径如下:
| 字段名 | 说明 |
|---|---|
| 引用名称 | 存储提取结果的变量名 |
| 正则表达式 | 用于匹配文本的模式 |
| 模板 | 指定使用哪个捕获组($1$表示第一个组) |
| 匹配数字 | 0表示随机,1表示第一个匹配,-1表示所有匹配 |
| 缺省值 | 匹配失败时的默认值 |
JMeter底层用的是Jakarta ORO正则表达式库,语法上和Perl兼容,所以如果你写过Perl风格的正则,上手会非常快。
. 匹配任意单个字符\d 匹配数字\w 匹配字母、数字或下划线\s 匹配空白字符* 匹配前一个元素0次或多次+ 匹配前一个元素1次或多次? 匹配前一个元素0次或1次{n} 匹配前一个元素恰好n次圆括号()是用来创建捕获组的,这样才能把匹配到的特定部分单独提取出来:
// Ja va代码示例:演示正则表达式捕获组
import ja va.util.regex.*;
public class RegexExample {
public static void main(String[] args) {
String text = "Order ID: 12345, Date: 2023-05-20";
Pattern pattern = Pattern.compile("Order ID: (\\d+), Date: (\\d{4}-\\d{2}-\\d{2})");
Matcher matcher = pattern.matcher(text);
if (matcher.find()) {
System.out.println("Order ID: " + matcher.group(1));
System.out.println("Date: " + matcher.group(2));
}
}
}
假设响应是这样的:,我们想拿到那个token值。
flowchart TD
A[响应文本] --> B[正则表达式提取器]
B --> C[正则表达式: name="csrfToken" value="(.+?)"]
C --> D[模板: $1$]
D --> E[变量: csrfToken=a1b2c3d4e5]
配置参数如下:
csrfTokenname="csrfToken" value="(.+?)"$1$1NOT_FOUND这次响应是JSON格式:{"users":[{"id":101,"name":"Alice"},{"id":102,"name":"Bob"}]},想把所有用户ID都提取出来。
// Ja va代码示例:提取JSON中的多个用户ID
import ja va.util.regex.*;
public class MultiValueExample {
public static void main(String[] args) {
String json = "{\"users\":[{\"id\":101,\"name\":\"Alice\"},{\"id\":102,\"name\":\"Bob\"}]}";
Pattern pattern = Pattern.compile("\"id\":(\\d+)");
Matcher matcher = pattern.matcher(json);
int count = 0;
while (matcher.find()) {
System.out.println("User " + (++count) + " ID: " + matcher.group(1));
}
}
}
JMeter里对应的配置:
userId"id":(\\d+)$1$-1(提取所有匹配项)NOT_FOUND后续使用时可以通过userId_1、userId_2这样的变量名访问每个值。
这一点在实际工作中经常踩坑。默认情况下,量词(如*、+)是贪婪的,会尽可能多地匹配字符。加个?能让它变“懒”:
a.*b 在 “aabab” 中匹配的是 “aabab”a.*?b 在 “aabab” 中会匹配出 “aab” 和 “ab”(?=pattern)(?!pattern)(?<=pattern)(?举个例子,如果只想提取price后面的数值,而不把price本身带出来,可以这么写:
(?<=price":)\d+
匹配不到数据:先确认响应里确实有你想要的内容,再检查正则中的特殊字符有没有正确转义。实在不行就写个简单表达式先测一步,逐步缩小范围。
提取了错误数据:说明你的正则写得不够“严谨”。可以增加上下文约束,使用非贪婪匹配,或者加上边界条件让匹配更精确。
性能问题:正则太复杂了就跑得慢。对于大体积响应,建议加一些边界限制来缩小搜索范围。
掌握JMeter正则表达式之后,处理动态内容就不再是难题了,测试计划的灵活性和可维护性都会上一个台阶。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8