🍉 一、前言
日常做 JMeter 接口自动化、性能测试时,经常遇到一类命名规则高度相似的 JSON 字段:
gsdmczygsdmddgsdmxxxgsdm
共同点:固定后缀是 gsdm,前缀随意不固定。
业务痛点:
- 每个字段单独写一个正则提取器,脚本臃肿、难维护;
- 接口响应同时存在
gsdm、czygsdm多个同后缀字段,需要灵活支持:取第一个、单独取值、全部批量提取; - 原生固定正则只能匹配固定字段,无法模糊匹配通用规则。
本文分享一条万能正则 ,一次性适配所有以 gsdm 结尾的字段,零基础直接照搬配置即可使用。
🥝 二、普通固定正则的缺点
常规写法只能精准匹配单个字段:
"gsdm":"(.*?)"
缺点很明显:
- 只能提取
gsdm,匹配不了czygsdm、ddgsdm; - 每新增一个带前缀的 gsdm 字段,就要新增一个正则提取器;
- 脚本冗余,后期维护成本极高。
🍎 三、万能正则表达式及逐字详解
3.1 通用万能正则
"(\w*gsdm)":"(.*?)"
3.2 逐字符通俗易懂拆解
-
"匹配 JSON 字段开头的双引号。 -
\w*
\w代表:字母、数字、下划线*代表:匹配 0 个或多个
合起来含义: 前缀可有可无,任意字符都能匹配
- 无前缀:
gsdm - 有前缀:
czygsdm、ddgsdm、abc123gsdm全部兼容
-
gsdm固定后缀关键字,限定必须以gsdm结尾。 -
":"匹配 JSON 字段名与值之间的冒号和前引号。 -
(.*?)
- 小括号
():捕获组,专门用来保存我们要提取的值 .*?:非贪婪匹配,精准取值,不会跨行乱匹配
🍓 四、捕获组与模板 $ 符号怎么用
正则里有两个捕获括号组:
- 第一组:
(\w*gsdm)→ 匹配字段名称 - 第二组:
(.*?)→ 匹配字段值(我们真正要用的数据)
✅ 取值关键:
- 要拿字段值 :模板填
$2$ - 要拿字段名 :模板填
$1$
业务场景 99% 都是填:$2$
🍑 五、JMeter 正则提取器完整配置
| 配置项 | 填写内容 |
|---|---|
| 引用名称 | gsdm_val |
| 正则表达式 | "(\w*gsdm)":"(.*?)" |
| 模板 | $2$ |
| 匹配数字 | 1 /-1(按业务选) |
| 缺省值 | NOT_FOUND |
匹配数字参数说明
- 填 1 :只取第一个匹配到的 gsdm 值
- 填 -1 :提取所有匹配项,自动生成数组
🥭 六、多字段同时存在的场景处理
示例 JSON 响应:
"gsdm":"202306281001",
"czygsdm":"202306281002"
场景 1:只取最先出现的第一个
匹配数字填:1 引用取值:${gsdm_val}
场景 2:全部提取,分开使用
匹配数字填:-1 取值方式:
${gsdm_val_1} 第一个匹配值
${gsdm_val_2} 第二个匹配值
${gsdm_val_matchNr} 匹配总数
场景 3:只想单独提取某一个字段
只提取原生 gsdm:
"gsdm":"(.*?)"
模板:$1$
只提取 czygsdm:
"czygsdm":"(.*?)"
模板:$1$
🍇 七、兼容不规范 JSON 进阶正则
有些接口格式不标准,key 和冒号中间有空格,用这个兼容版:
"(\w*gsdm)"\s*:\s*"(.*?)"
\s* 自动忽略任意空格、制表符,适配不标准 JSON 报文。
🥥 八、总结
\w*gsdm实现模糊匹配,完美兼容gsdm、czygsdm、ddgsdm所有同后缀字段;- 正则两个捕获组,业务取值固定用
$2$; - 匹配数字
1取单个值,-1批量提取为数组; - 一条正则替代多个提取器,精简脚本、降低维护成本,适配绝大多数接口场景。