跳到主要内容

正则表达式

21.1 概述

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

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

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

值得强调的是containsmatches之间的区别,正如在响应断言测试元素中使用的那样:

contains

表示正则表达式至少匹配目标的某些部分,因此 ' alphabet '"contains"' ph.b。' 因为正则表达式匹配子字符串 ' phabe '。

matches

表示正则表达式匹配整个目标。所以' alphabet '被' al.*t 'matches

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

然而,这并非总是如此。例如,正则表达式 alp|.lp.\* ``containsalphabet中,但不matches`` alphabet

为什么?因为当模式匹配器在alphabet中找到序列alp时,它会停止尝试任何其他组合——并且alpalphabet不同,因为它不包括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,可以快速测试对正则表达式的更改,而无需访问任何外部服务器。