如果可能,使表达式匹配可选值

时间:2014-10-08 19:48:14

标签: regex jmeter perl5

考虑以下文本,该文本可能是来自jMeter的HTTP响应的一部分:

<menu id="Alpha" name="alpha">
    <option value="a">A</option>
    <option value="b">B</option>
    <option value="c" selected="selected">C</option>
</menu>

<menu id="Bravo" name="bravo">
    <option value="d">D</option>
    <option value="e">E</option>
</menu>

如果选择了某个选项,我尝试提取每个菜单的ID以及所选选项的值。如果未选择任何选项,则默认情况下,应匹配第一个选项的值。例如,在此示例中,我希望匹配以下内容:

"Alpha" "c"
"Bravo" "d"

到目前为止,我写了以下内容:

<select id="Form:parameterList:([^"]+?)".*?>.*?(?:<option value="([^"]*?)".*?(?:selected="selected")?>)?.*?</select>

这个问题是只匹配第一个选项的值,并且永远不会匹配所选的选项。也就是说,我想优先匹配可选模式。

谢谢, 维克多

1 个答案:

答案 0 :(得分:1)

考虑您的脚本将如何使用复杂的正则表达式进行维护。

您可以使用xpath提取器,条件/循环控制器和/或后处理器来实现您想要的结果......

首先获取所有ID的列表:

//menu/@id

您可以获取一个ID列表,其中包含一个选项属性已选中=&#39;已选中&#39;类似于:

//menu/@id[/option[@selected='selected']]

遍历第一个列表(例如,在beanshell处理器或循环控制器中)。如果ID出现在第二个列表中,请使用以下内容提取所选值:

//menu[@id='xxxx']/option[@selected='selected']/@value  /*substitue xxxx with appropriate id*/

如果ID没有选择&#39; value,提取默认值:

//menu/[@id='xxxx']/option[1]/@value  /*substitue xxxx with appropriate id*/

(对不起,如果我的xpath不完全准确,我只从内存中写出来,但希望面包屑可以跟随)