如何从JMeter中的变量中转义正则表达式字符?

时间:2012-11-20 11:53:31

标签: regex jmeter

问题很简单。我有正则表达式用于从响应中提取一些数据。它看起来像是:

<input type="hidden" +name="reportpreset_id" +value="(\w+)" *>${reportPresetName}</td>

问题是变量${reportPresetName}可能包含正则表达式使用的字符,如括号或点 我试图用\Q\E(基于that)包围这个变量,但显然这些标记不起作用(显然Java支持这个标记,所以我很困惑)。 当我添加那些标记时,即使这个表达式对${reportPresetName}变量的任何内容都失败了(即使是在没有这些标记的情况下工作的情况)。

我已经检查了list of functions in JMeter,但我没有找到任何有用的东西。 有谁知道如何在JMeter中转义正则表达式字符?

<小时/> 更新:
当我使用此\Q\E进行断言时,它会失败。当我从“查看结果树”中的断言日志执行正则表达式的副本并在记录的响应数据上对其进行测试时,它可以工作!所以它看起来像JMeter中的某种错误。

3 个答案:

答案 0 :(得分:3)

Jmeter在Regexp Extractor和Regexp Tester中使用jakarta ORO作为其regexp引擎:

但它使用Java Regexp Engine在HTML / Text Viewer中进行搜索。

读:

你可以在regexp之后使用Groovy添加一个JSR223后处理器,它使用以下方法提取var和escape regexp chars:

org.apache.oro.text.regex.Perl5Compiler.quotemeta(String valueToEscape)

从即将发布的2.9版本开始,我们创建了一个新功能:

  • __ escapeOroRegexpChars(要转义的字符串,变量名称)

答案 1 :(得分:1)

\Q\E使用Java,请参阅Pattern

在Java中,我们使用加倍反斜杠字符,因此您可能需要使用(\\w+),当然还需要使用\\Q\\E

我不确定你的情况,因为我实际上并不理解你的背景(到目前为止从未使用过JMeter)。

答案 2 :(得分:0)

如果JMeter不支持\\Q\\E(我不知道是否......),您可以编写自己的函数/过程,将字符串拆分为字符并使用转义序列替换每个字符,如下所示:

  • 如果字符为\,则将其替换为\\\\
  • 否则在字符前添加前缀\\

这不是最佳方法,但可以肯定它会根据需要运作。


例如输入

This is-a\string 12&$34|!`^5

你会得到

\\T\\h\\i\\s\\ \\i\\s\\-\\a\\\\s\\t\\r\\i\\n\\g\\ \\1\\2\\&\\$\\3\\4\\|\\!\\`\\^\\5