21. 正则表达式¶
21.1 概述¶
JMeter 包括模式匹配软件Apache Jakarta ORO
在 Jakarta 网站上有一些关于此的文档,例如
模式匹配字符的摘要
OROMatcher 用户指南 中还有关于该产品的旧版本的文档 ,这可能证明是有用的。
模式匹配与 Perl 中的模式匹配非常相似。Perl 的完整安装将包含大量关于正则表达式的文档——查找perlrequick、 perlretut、perlre和perlreref。
值得强调的是“包含”和“匹配”之间的区别,正如在响应断言测试元素中使用的那样:
- “包含”
- 表示正则表达式至少匹配目标的某些部分,因此 ' alphabet '"包含"' ph.b。' 因为正则表达式匹配子字符串 ' phabe '。
- “匹配”
- 表示正则表达式匹配整个目标。所以' alphabet '被' al.*t '“匹配” 。
在这种情况下,它相当于将正则表达式包装在^和$中,即' ^al.*t$ '。
然而,这并非总是如此。例如,正则表达式“ alp|.lp.* ”“包含”在“ alphabet ”中,但不“匹配”“ alphabet ”。
为什么?因为当模式匹配器在“ alphabet ”中找到序列“ alp ”时,它会停止尝试任何其他组合——并且“ alp ”与“ alphabet ”不同,因为它不包括“ habet ”。
那么如果没有尾随/ ,如何使用修饰符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.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
21.3 线路模式¶
模式匹配的行为方式略有不同,具体取决于多行和单行修饰符的设置。注意单行和多行操作符是没有关系的;它们可以独立指定。
单线模式
单行模式仅影响 ' . ' 元字符被解释。
默认行为是 ' . ' 匹配除换行符以外的任何字符。在单行模式下, ' . ' 也匹配换行符。
多线模式
多行模式仅影响元字符“ ^ ”和“ $ ”的解释方式。
默认行为是“ ^ ”和“ $ ”仅匹配字符串的开头和结尾。当使用多行模式时,' ^ ' 元字符匹配每行的开头,而' $ ' 元字符匹配每行的结尾。
21.4 元字符¶
正则表达式使用某些字符作为元字符——这些字符对 RE 引擎具有特殊意义。此类字符必须在它们前面加上\(反斜杠)进行转义,以便将它们视为普通字符。这是元字符及其含义的列表(如有疑问,请查看 ORO 文档)。
- (和)
- 分组
- [和]
- 字符类
- {和}
- 重复
- *、+和?
- 重复
- .
- 通配符
- \
- 转义字符
- |
- 备择方案
- ^和$
- 字符串或行的开始和结束
ORO 支持以下 Perl5 扩展正则表达式。
- (?#文本)
- 导致文本被忽略的嵌入注释。
- (?:正则表达式)
- 将“ () ”之类的内容分组,但不会保存组匹配。
- (?=正则表达式)
- 一个零宽度的正向超前断言。例如,\w+(?=\s)匹配后跟空格的单词,但 MatchResult 中不包含空格。
- (?!正则表达式)
- 零宽度负前瞻断言。例如foo(?!bar)匹配任何出现的“ foo ”,但后面没有“ bar ”。请记住,这是一个零宽度断言,这意味着a(?!b)d将匹配ad因为a后面跟着一个不是b的字符(d)并且 a d 在零宽度断言之后。
- (?imsx)
- 一个或多个嵌入式模式匹配修饰符。i启用不区分大小写,m启用输入的多行处理,s启用输入的单行处理,x启用扩展的空白注释。
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,可以快速测试对正则表达式的更改,而无需访问任何外部服务器。