【Jmeter】正则表达式提取及常见技巧
1、正则表达式正则表达式(regular expression)描述了一种字符串匹配的模式(pattern),可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等。具体介绍及使用可参考菜鸟教程:https://www.runoob.com/regexp/regexp-tutorial.html常用的元字符:比如正则表达式中\d+ 是来匹配1个或更多连续的数字。
1、正则表达式
正则表达式(regular expression)描述了一种字符串匹配的模式(pattern),可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等。
具体介绍及使用可参考菜鸟教程:https://www.runoob.com/regexp/regexp-tutorial.html
常用的元字符:
比如正则表达式中\d+ 是来匹配1个或更多连续的数字。
常用的限定符
限定符用来指定正则表达式的一个给定组件必须要出现多少次才能满足匹配。有 * 或 + 或 ? 或 {n} 或 {n,} 或 {n,m} 共6种。正则表达式的限定符有:
* 和 + 限定符都是贪婪的,因为它们会尽可能多的匹配文字,只有在它们的后面加上一个 ? 就可以实现非贪婪或最小匹配。
.*:贪婪匹配原则,即匹配到不能匹配为止
.*?:非贪婪匹配,即在匹配成功的情况下尽可能少的匹配
另外,正则表达式还有一些特殊的语法,比如:
(xy) : 将()里面的字符作为整体进行匹配,括号里面的内容是一个子表达式或者叫分组。例如,"(ha)"就可以匹配"happy"中的"ha"。
[xy] : 匹配[]内所包含的任意一个字符。例如,"[xyz]"可以匹配"happy"中的"y"
2、正则表达式提取常见的几种情况
- 提取全部:^(.*)$
- 提取中间某一段:(.*?) 或(.+?)
- 从中间某处提取到末尾:([^"]+)
- 转义:\
- 换行:\n
说明:(.+?) 和 (.*?) 的区别:
(.+?)提取1个字符串及以上,不要太贪婪,在找到第一个匹配项后停止;
(.*?)提取0个字符串及以上,要取的值是空值的时候可以取得到。
例如:“test":"",如果要取test的值,使用 (.+?) 匹配不到值。使用 (.*?) 则可以取到test的值为空,写法是: “test":"(.*?)"。
3、正则表达式测试器
可以通过下面的小工具来验证自己写的正则表达式是否正确,例如我先想获取/opportunity/show/858401?workflowInstance=858416 中的 858401、858416 两个数据(或者使用在线工具进行测试https://tool.oschina.net/regex)
其中858401 可以通过(\d+)、(.*?)\来提取,858416可以通过(\d+)、([^"]+)来提取
4、正则表达式举例说明
(1)提取单个字符串
假设我们想要匹配Web页面的如下部分:name = "file" value = "readme.txt">并要提取readme.txt。一个合适的正则表达式是:name = "file" value = "(.+?)">。我们可以这么写:
引用名称:file
正则表达式:name = "file" value = "(.+?)">
模板:$1$
readme.txt在需要引用的地方可以通过:${file}进行使用。
(2)提取多个字符串:
假设我们想要匹配Web页面的如下部分:name = "file.name" value = "readme.txt">并要提取file.name
和readme.txt。一个合适的正则表达式是:name = "(.+?)" value = "(.+?)"。
这样就会创建2个组,分别用于$1$和$2$。我们可以这么写:
引用名称:file
正则表达式:name = "(.+?)" value = "(.+?)"
模板:$1$$2$
如下变量的值将会被设定为:
file : file.namereadme.txt
file_g0 : name = "file.name" value = "readme.txt"
file_g1 : file.name
file_g2 : readme.txt
在需要引用的地方可以通过:${file}, ${file_g0},{file_g1},{file_g2}进行使用。
(3)正则表达式中有转义符(例如: \ ?),需要进行转义:
例如:id?test\":"1234" ,我们想要匹配出1234。
一个合适的正则表达式是: id\?test\\":"(.+?)"
(4)从消息头(header)提取session:
(5)、可以使用换行 “\n”结尾进行匹配,例如提取Server的值nginx:
(6)多处匹配
还有一种不常用的情况是,出现了多处匹配,可以根据模板先提取第几处的数据,再根据引用名称_g0、引用名称_g1、引用名称_g2等进行匹配:
例如:上图有3处匹配,我们如果想提取882812(第2行第1个),我们可以这么写:
引用名称:ddid
正则表达式:/opportunity/show/(.*?)\?workflowInstance=(\d+))
模板:$2$
如下变量的值将会被设定为:
ddid_g0 : /opportunity/show/882812?workflowInstance=882842
ddid_g1 : 882812
ddid_g2 :882842
在需要引用的地方可以通过:${ ddid_g1}进行使用3。
(7)提取重定向后url中的参数
在一个线程组中,C请求需要使用A请求中重定位后的url中的订单id参数,同时需要使用B请求中与订单id对应的流程id参数,因此需要做关联处理。使用到Jmeter中后置处理器中的正则表达式提取器。
5、正则表达式提取器
允许用户从作用域内的sampler请求的服务器响应结果中通过正则表达式提取值所需值,生成模板字符串,并将结果存储到给定的变量名中。
Jmeter中后置处理器->正则表达式提取器
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)