21. 正则表达式

21.1 概述

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

OROMatcher 用户指南 中还有关于该产品的旧版本的文档 ,这可能证明是有用的。

模式匹配与 Perl 中的模式匹配非常相似。Perl 的完整安装将包含大量关于正则表达式的文档——查找perlrequickperlretutperlreperlreref

值得强调的是“包含”和“匹配”之间的区别,正如在响应断言测试元素中使用的那样:

包含
表示正则表达式至少匹配目标的某些部分,因此 ' alphabet '"包含"' ph.b。' 因为正则表达式匹配子字符串 ' phabe '。
匹配
表示正则表达式匹配整个目标。所以' alphabet '被' al.*t '“匹配” 。

在这种情况下,它相当于将正则表达式包装在^$中,即' ^al.*t$ '。

然而,这并非总是如此。例如,正则表达式“ alp|.lp.* ”“包含”在“ alphabet ”中,但不“匹配”“ alphabet ”。

为什么?因为当模式匹配器在“ alphabet ”中找到序列“ alp ”时,它会停止尝试任何其他组合——并且“ alp ”与“ alphabet ”不同,因为它不包括“ habet ”。

与 Perl 不同,不需要(即不要)将正则表达式括在//中。

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

21.2 示例

提取单个字符串

假设您想要匹配网页的以下部分:
name="file" value="readme.txt">
并且您想要提取readme.txt
一个合适的正则表达式是:
name="file" value="(.+?)">

上面的特殊字符是:

()
这些包含要返回的匹配字符串部分
.
匹配任何字符
+
一次或多次
?
不要贪心,即在第一场比赛成功时停止

注意:没有? , .+将继续超过第一个"> 直到找到最后一个可能的"> - 这可能不是预期的。

注意:虽然上述表达式有效,但使用以下表达式更有效:
name="file" value="([^"]+)"> 其中
[^"] - 表示匹配除"
之外的任何内容 在这种情况下,匹配引擎一看到第一个"就可以停止查找,而在前一种情况下,引擎必须检查它是否找到了">而不是说" >

提取多个字符串

假设您想要匹配网页的以下部分:
name="file.name" value="readme.txt" ,并且您想要提取file.namereadme.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 线路模式

模式匹配的行为方式略有不同,具体取决于多行和单行修饰符的设置。注意单行和多行操作符是没有关系的;它们可以独立指定。

单线模式

单行模式仅影响 ' . ' 元字符被解释。

默认行为是 ' . ' 匹配除换行符以外的任何字符。在单行模式下, ' . ' 也匹配换行符。

多线模式

多行模式仅影响元字符“ ^ ”和“ $ ”的解释方式。

默认行为是“ ^ ”和“ $ ”仅匹配字符串的开头和结尾。当使用多行模式时,' ^ ' 元字符匹配每行的开头,而' $ ' 元字符匹配每行的结尾。

21.4 元字符

正则表达式使用某些字符作为元字符——这些字符对 RE 引擎具有特殊意义。此类字符必须在它们前面加上\(反斜杠)进行转义,以便将它们视为普通字符。这是元字符及其含义的列表(如有疑问,请查看 ORO 文档)。

()
分组
[]
字符类
{}
重复
*+?
重复
.
通配符
\
转义字符
|
备择方案
^$
字符串或行的开始和结束
请注意,ORO 不支持\Q\E元字符。[在其他 RE 引擎中,这些可用于引用 RE 的一部分,以便元字符代表它们自己。] 您可以使用函数来执行等效操作,请参阅${__escapeOroRegexpChars(valueToEscape)}

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

(?#文本)
导致文本被忽略的嵌入注释。
(?:正则表达式)
将“ () ”之类的内容分组,但不会保存组匹配。
(?=正则表达式)
一个零宽度的正向超前断言。例如,\w+(?=\s)匹配后跟空格的单词,但 MatchResult 中不包含空格。
(?!正则表达式)
零宽度负前瞻断言。例如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,可以快速测试对正则表达式的更改,而无需访问任何外部服务器。

Go to top