软件测试技术之JMeter官方文档:21. 正则表达式
白羽 2018-07-20 来源 :网络 阅读 1000 评论 0

摘要:本文将带你了解软件测试技术之JMeter官方文档:21. 正则表达式,希望本文对大家学测试技术有所帮助。

21. 正则表达式



21.1 概述



JMeter 包含模式匹配软件 Apache Jakarta ORO 。
在 Jakarta 网上有一些关于它的文档,例如:模式匹配字符摘要。

在 OROMatcher 用户指南上还有一个关于该产品旧版本的文档 ,也许会有些用处。

模式匹配与 Perl 中的模式匹配非常类似。Perl 的完整安装会包含大量关于正则表达式的文档——查找 perlrequick, perlretut, perlre 和 perlreref。

有必要强调“包含(contains)”和“匹配(matches)”之间的区别,它们被用在响应断言测试原件上:

“包含(contains)” 意味着正则表达式至少与目标的某个部分相匹配,所以 ‘alphabet’ “包含” ‘ph.b.‘,因为正则表达式匹配子字符串 ‘phabe‘。

“匹配(matches)” 意味着正则表达式匹配整个目标。所以 ‘alphabet’ 和 ‘al.*t’ 是“匹配”的 。
这种情况下,它相当于将正则表达式封装在 ^ 和 $ 中,即 ‘^al.*t$‘。

然而,情况并非总是如此。例如,正则表达式 ‘alp|.lp.*’ “包含”于 ‘alphabet‘,但并不“匹配” ‘alphabet‘。

这是为什么?原因是当模式匹配器在 ‘alphabet’ 中找到序列 ‘alp’ 时,它将停止尝试其他组合——而 ‘alp’ 与 ‘alphabet’ 不同,它不包含 ‘habet‘。


不同于 Perl,没有必要将正则表达式用 // 封装。


那么如果没有尾部的 /,该如何使用 ismx 等修饰符呢?解决方法是使用扩展的正则表达式,即 /abc/i 变成 (?i)abc。请参阅下面的21.5 修饰符的放置。

21.2 举例



提取单个字符串



假设您想要匹配网页的以下部分:
name=“file” value=“readme.txt”>
并且要提取 readme.txt。

一个符合的正则表达式:
name=“file “value =”(.+?)“>

上面的特殊字符是:
( 和 )    这些包围匹配字符串的部分将被返回

.    匹配任何字符

+    一次或多次

?    不要贪婪,即在第一次匹配成功时停止

注意:如果没有 ?,.+ 找到第一个 ”> 后会继续寻找,直到找到最后一个 ”> ——这可能不是我们所期望的。

注意:虽然上面的正则表达式可用,但使用下面的表达式会更有效率:
name =“file” value =“([^“]+)”>
其中 [^“] ——表示匹配任意(除了 “ ),在这种情况下,匹配引擎只要找到第一个 “ 就可以停止查找,而在之前的情况下,引擎必须检查它是否已经找到 ”> 而不是 ” >。

提取多个字符串



假设你想匹配一个网页的以下部分:
name =“file.name” value =“readme.txt”,你想提取 file.name 和 readme.txt。
符合的正则表达式:
name=“([^“]+)” value=“([^“]+)”
这将创建 2 个匹配组,可以在 JMeter 正则表达式提取器模板中用 $1$ 和 $2$ 来引用。

JMeter 正则表达式提取器将组的值保存在指定变量中。

例如,假设:


参考名称(Reference Name):MYREF
正则表达式(Regex):name=“(.+?)” value=“(.+?)”
模板(Template):$1$$2$



不要将正则表达式放在 / / 中


以下变量将被设置:

MYREF
:        file.namereadme.txt
MYREF_g0
:        name=“file.name” value=“readme.txt”
MYREF_g1
:        file.name
MYREF_g2
:        readme.txt

这些变量可以在 JMeter 后续的测试计划中引用,形如 ${MYREF},${MYREF_g1} 等。

21.3 行模式



模式匹配可以有不同的表现方式,这取决于多行和单行修饰符的设置。注意单行和多行操作符之间没有任何关系,它们可以单独指定。

单行模式



单行模式只影响关键字 ‘.’ 的解释。

默认情况下, ‘.’ 匹配除换行符之外的任何字符。在单行模式下, ‘.’ 也匹配换行符。

多行模式



多行模式只影响关键字 ‘^’ 和 ‘$’ 的解释。

默认情况下 ‘^’ 和 ‘$’ 只匹配字符串的开头和结尾。在多行模式下,关键字 ‘^’ 匹配每一行的开头,关键字 ‘$’ 匹配每一行的结尾。

21.4 关键字



正则表达式使用特定字符作为关键字——这些字符对 RE 引擎有特殊的意义。这些字符必须用 ____(反斜杠)前缀来转义,转义之后才能将它们视为普通字符。以下是关键字及其含义的列表(如有疑问,请查阅 ORO 文档)。

( 和 )
* 分组

[ 和 ]
* 字符集合

{ 和 }
* 重复

*,+ 和 ?
* 重复

.
* 通配符

__
* 转义字符

|
* 选择符

^ 和 $
* 字符串或行的开始和结束


请注意,ORO 不支持关键字 \Q 和 \E。[在其他的 RE 引擎中,这些可以用来引用 RE 的一部分,使关键字代表它们自己。]可以使用函数来执行相同的操作,请参阅 ${__escapeOroRegexpChars(valueToEscape)}。


ORO 支持以下 Perl5 扩展正则表达式。

(?#text)
* 内嵌注释,可以使 text 内容被忽略。

(?:regexp)
* 像”()“一样获取匹配,但并不保存匹配结果。

(?=regexp)
* 零长度正向肯定断言。例如,\w+(?=\s) 匹配一个后跟空格的单词,匹配结果不包含空格。

(?!regexp)
* 零长度正向否定断言。例如,foo(?!bar) 匹配任何 ‘far’ 后面不跟 ‘foo’ 的结果。请注意,这是一个零长度断言,这意味着 a(?!b)d 匹配 ad,因为 a 后面是一个非 b 字符(d),而 d 符合此断言。

(?imsx)
* 一个或多个嵌入模式匹配修饰符。i 启用大小写不敏感,m 启用多行输入处理,s 启用单行输入处理,x 启用扩展的空白注释。

请注意: (?<=regexp) ——反向肯定断言——不支持。

21.5 修饰符的放置



修饰符可以放在正则表达式的任何地方,然后从放置点开始作用。[ ORO 中有个 bug 使它们不能放在正则表达式的最后。不过,对其他没有影响。]

单行 (?s) 和多行 (?m) 修饰符通常放置在正则表达式的开头。

忽略大小写修饰符 (?i) 可以适用于正则表达式的一部分,例如:

Match ExAct case or (?i)ArBiTrARY(?-i) case


将匹配 Match ExAct case or arbitrary case 以及 Match ExAct case or ARBitrary case,但不匹配 Match exact case or ArBiTrARY case。

21.6 测试正则表达式



从 JMeter 2.4 开始,监听器查看结果树包含一个正则表达式测试器,用于直接在采样器响应数据上测试正则表达式。

还有一个网站来测试 Java 正则表达式。

另一种方法是使用简单的测试计划来测试正则表达式。Java 请求采样器可用于生成示例,或 HTTP 采样器可用于加载文件。添加 Debug Sampler 和树视图监听器,可以无需访问任何外部服务器,快速测试出正则表达式的更改。    

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标软件测试之测试技术频道!

本文由 @白羽 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程