为什么jmeter中的正则表达式提取器并不总是提取相同的值?

时间:2012-05-30 16:18:06

标签: regex jmeter

我有两个WebService(SOAP)请求。两个Web服务调用的响应在结构上完全相同。对于Web服务呼叫号码1,它具有以下结构,

  <data xsi:type="soapenc:string">0</data>
  <data xsi:type="soapenc:string">650</data>

对于Web服务电话号码2,它具有以下结构,

  <data xsi:type="soapenc:string">0</data>
  <data xsi:type="soapenc:string">10203</data>

在每个调用中,我都有一个正则表达式提取器。参考名称不同;但一切都定义完全相同。提取器具有以下定义。

Apply to: Main Sample Only
Response Field to check: Body
Regular Expression: <data xsi:type="soapenc:string">(\d+?)</data>
Template: $1$
Match No.: 0

对于Web服务电话号码1,提取器获取值650,这就是我想要的。但对于Web服务调用号2,提取器实际上获取的值为0,这不是我想要的。我想在Web服务电话号码2中得到的是10203.我的问题是,为什么正则表达式提取器定义会返回两个不同的结果?


提前谢谢,

4 个答案:

答案 0 :(得分:3)

如果您使用匹配数为零,则会随机为正则表达式提取值。 0 =随机匹配,1 =第一次匹配,2 =第二次等等......

答案 1 :(得分:2)

看起来你已经问过same question here

  1. 使用Regular Expression ExtractorXPath Extractor - 哪个更适合解析xml,如上面的评论中所述, - 使用单个表达式 - (对于RegEx Extractor:{{1} },对于XPath Extractor:<data xsi:type="soapenc:string">(.+?)</data> - 获取所有匹配项 然后使用相应的生成变量来访问您需要的匹配项 - 通过//data/text(),例如(要查询通过查询提取的第二个匹配到refName变量),这对于RegEx和XPath Extractors都是实际的,或者通过设置“匹配号”强制RegEx Extractor默认使用特定匹配。 (如上例所示)。

  2. XPath Extractorxpath query一起使用,它将在另一个中唯一地描述所需的值:按固定位置 - 在您的情况下类似${refName_2}(假设第一场比赛始终为0且你需要第二个), - 或者通过值 - 比较匹配的文本()到0,如//data[position()=2]/text()

答案 2 :(得分:0)

我对你的正则表达式?感到困惑:(\d+?)。这意味着“一个或多个数字,但可选。”

根据来自电话号码1和电话号码2的输入数据,我希望它在两种情况下都匹配第一行<data xsi:type="soapenc:string">0</data>,但你说它没有。{/ p>

我怀疑不想将数字与前导零相匹配。所以我建议

Regular Expression: <data xsi:type="soapenc:string">([1-9]\d*)</data>

答案 3 :(得分:0)

给定网络服务电话

对于网络服务电话号码1,它具有以下结构

<data xsi:type="soapenc:string">0</data>
  <data xsi:type="soapenc:string">650</data>

对于Web服务电话号码2,它具有以下结构

<data xsi:type="soapenc:string">0</data>
  <data xsi:type="soapenc:string">10203</data>

我们可以通过以下格式从Web服务呼叫号码1中提取值650

</data>\s\s<data xsi:type="soapenc:string">(.+)</data>
or
</data>\s\s<data xsi:type="soapenc:string">([0-9]+)</data>

我们可以通过以下格式从Web服务电话号码2中提取值10203

</data>\s\s<data xsi:type="soapenc:string">(.+)</data>
or
</data>\s\s<data xsi:type="soapenc:string">([0-9]+)</data>