关于jmeter正则表达式的一个实际应用
接口响应内容如下
{ "code": 200, "msg": "成功", "data": { "projectId": 178, "type": 5, "data": "[{\"ioType\":1,\"type\":0,\"id\":115},
{\"ioType\":1,\"type\":1,\"id\":1361},
{\"ioType\":1,\"type\":2,\"id\":1362},
{\"ioType\":1,\"type\":3,\"id\":1363},
{\"ioType\":2,\"type\":6,\"id\":1838},
{\"ioType\":2,\"type\":1,\"id\":1839},
{\"ioType\":2,\"type\":4,\"id\":1840},
{\"ioType\":2,\"type\":3,\"id\":1841},
{\"ioType\":2,\"type\":2,\"id\":1842}]", "current": "1" } }
本次要提取的是 {\"ioType\":2,\"type\":6,\"id\":1838} 中的 id 值,也就是当前示例中的1838
开始打算使用json提取器来逐级提取,但是发现内层data的值并不是一个列表,而是一个字符串(列表被一个引号包裹住了),这样就无法使用json提取器了
所以决定使用正则表示提取器来试试(这里的关键是确保书写的正则表达式是正确的)
注意⚠️:
通过观察 {\"ioType\":2,\"type\":6,\"id\":1838} 可以看到每个 " 前都有一个 \
所以在写表达式时需要转义一下它,不然会识别不出来。。。
方法也很简单,在 \ 前,再加一个 \ 即可
这样的话,正则表达式可以如下
正则表达式:{\\"ioType\\":2,\\"type\\":6,\\"id\\":(\d*)}
因为每个响应中都有【\\"ioType\\":2,\\"type\\":6】,所以这里可以写死,然后提取对应的id值即可
模版:$1$
因为这个表达式只有一个分组(正则表达式中一个括号表示一个分组),所以这里写1就行,表示引用组1
ps. 引用组的语法是:$1$引用组1,$2$引用组2。$0$引用整个表达式匹配的内容
匹配数字:1
正则表达式匹配数据的所有结果可以看做一个数组,匹配数字即可看做是数组的第几个元素;
-1表示全部,0随机,1第一个,2第二个,以此类推。若只要获取到匹配的第一个值,则填写1
要验证正则表达式的提取结果,可以添加一个调试取样器,运行脚本来看下响应结果
后面接口引用时,可以引用type_id或者type_id_g1
如果ioType和type中的值不固定,每次请求后都显示随机的的值,那么只能按照列表中每组值的顺序来提取
通过观察,发现 {\"ioType\":2,\"type\":6,\"id\":1838} 出现在列表中的第5个位置
所以可以按照如下方式来写正则表达式
这次结果如下: