正则表达式
21.1 概述
JMeter 包括模式匹配软件 Apache Jakarta ORO
在 Jakarta 网站上有一些关于此的文档,例如 模式匹配字符的摘要
OROMatcher 用户指南 中还有关于该产品的旧版本的文档 ,这可能证明是有用的。
模式匹配与 Perl 中的模式匹配非常相似。Perl 的完整安装将包含大量关于正则表达式的文档——查找 perlrequick、 perlretut、perlre 和 perlreref。
值得强调的是contains
和matches
之间的区别,正如在响应断言测试元素中使用的那样:
contains
表示正则表达式至少匹配目标的某些部分,因此 ' alphabet '"contains"' ph.b。' 因为正则表达式匹配子字符串 ' phabe '。
matches
表示正则表达式匹配整个目标。所以' alphabet '被' al.*t 'matches
。
在这种情况下,它相当于将正则表达式包装在^和$中,即' ^al.*t$ '。
然而,这并非总是如此。例如,正则表达式 alp|.lp.\* ``contains
在alphabet
中,但不matches`` alphabet
。
为什么?因为当模式匹配器在alphabet
中找到序列alp
时,它会停止尝试任何其他组合——并且alp
与alphabet
不同,因为它不包括habet
。
与 Perl 不同,不需要(即不要)将正则表达式括在//中。
那么如果没有尾随/ ,如何使用修饰符 ismx 等?解决方案是使用扩展正则表达式,即/abc/i 变为(?i)abc。另请参阅下面 的修饰符 放置。
21.2 示例
提取单个字符串
假设你想要匹配网页的以下部分:
name="file" value="readme.txt">
并且你想要提取 readme.txt。
一个合适的正则表达式是:
name="file" value="(.+?)">
上面的特殊字符是:
(and)
这些包含要返回的匹配字符串部分
.
匹配任何字符
一次或多次
?
不要贪心,即在第一场比赛成功时停止
注意:没有? , .+
将继续超过第一个">
直到找到最后一个可能的">
s- 这可能不是预期的。
注意:虽然上述表达式有效,但使用以下表达式更有效:
name="file" value="([^"]+)"> 其中
[^"] - 表示匹配除"
之外的任何内容 在这种情况下,匹配引擎一看到第一个"就可以停止查找,而在前一种情况下,引擎必须检查它是否找到了">而不是说" >。
提取多个字符串
假设你想要匹配网页的以下部分:
name="file.name" value="readme.txt" ,并且你想要提取 file.name 和 readme.txt。
一个合适的正则表达式是:
name="([^"]+)" value="([^"]+)"
这将创建 2 个组,可以在 JMeter 正则表达式提取器模板中用作$1$和 2 美元。
JMeter Regex Extractor 将组的值保存在附加变量中。
例如,假设:
- 参考名称:MYREF
- 正则表达式:name="(.+?)" value="(.+?)"
- 模板:$1$$2$
不要将正则表达式括在//中
将设置以下变量:
MYREF
文件名 readme.txt
MYREF_g0
name="file.name" value="readme.txt"
MYREF_g1
文件名
MYREF_g2
自述文件.txt
这些变量可以稍后在 JMeter 测试计划中引用,如${MYREF}、${MYREF_g1}等。
21.3 Line mode
模式匹配的行为方式略有不同,具体取决于多行和单行修饰符的设置。注意单行和多行操作符是没有关系的;它们可以独立指定。
单线模式(Single-line mode)
单行模式仅影响 ' . ' 元字符被解释。
默认行为是 ' . ' 匹配除换行符以外的任何字符。在单行模式下, ' . ' 也匹配换行符。
多线模式(Multi-line mode)
多行模式仅影响元字符^
和$
的解释方式。
默认行为是^
和$
仅匹配字符串的开头和结尾。当使用多行模式时,' ^ ' 元字符匹配每行的开头,而' $ ' 元字符匹配每行的结尾。
正则表达式使用某些字符作为元字符——这些字符对 RE 引擎具有特殊意义。此类字符必须在它们前面加上\(反斜杠)进行转义,以便将它们视为普通字符。这是元字符及其含义的列表(如有疑问,请查看 ORO 文档)。
( and )
grouping
[ and ]
character classes
{ and }
重复
*、+and ?
重复
.
通配符
\
转义字符
|
备选方案
^和$
字符串或行的开始和结束
ORO 支持以下 Perl5 扩展正则表达式。
(?#text)
导致文本被忽略的嵌入注释。
(?:regexp)
将()
之类的内容分组,但不会保存组匹配。
(?=regexp)
一个零宽度的正向超前断言。例如,\w+(?=\s)匹配后跟空格的单词,但 MatchResult 中不包含空格。
(?!regexp)
零宽度负前瞻断言。例如 foo(?!bar)匹配任何出现的foo
,但后面没有bar
。请记住,这是一个零宽度断言,这意味着 a(?!b)d 将匹配 ad 因为 a 后面跟着一个不是 b 的字符(d)并且 a d 在零宽度断言之后。
(?imsx)
一个或多个嵌入式模式匹配修饰符。i 启用不区分大小写,m 启用输入的多行处理,s 启用输入的单行处理,x 启用扩展的空白注释。
请注意,(?<=regexp) -lookbehind - 不受支持。
21.5 修饰符的放置
修饰符可以放置在正则表达式中的任何位置,并从该点开始应用。[ORO 中的一个错误意味着它们不能在正则表达式的最后使用。但是无论如何,它们在那里没有任何作用。]
单行(?s)和多行(?m)修饰符通常放置在正则表达式的开头。
忽略大小写修饰符(?i)可以有效地应用于正则表达式的一部分,例如:
Match ExAct case or (?i)ArBiTrARY(?-i) case
将匹配 Match ExAct 大小写或任意大小写以及 Match ExAct 大小写或 ARBitrary 大小写,但不匹配精确大小写或 ArBiTrARY 大小写。
21.6 测试正则表达式
从 JMeter 2.4 开始,监听器 View Results Tree 包含一个 RegExp 测试器,用于直接在采样器响应数据上测试正则表达式。
有一个 网站 可以测试 Java 正则表达式。
另一种方法是使用简单的测试计划来测试正则表达式。Java 请求采样器可用于生成示例,或者 HTTP 采样器可用于加载文件。添加 Debug Sampler 和 Tree View Listener,可以快速测试对正则表达式的更改,而无需访问任何外部服务器。