正则表达式:阅读《全栈性能测试修炼宝典 Jmeter实战》发现的一个正则表达式问题
问题。
《全栈性能测试修炼宝典 Jmeter实战》是市面上关于Jmeter性能测试写的最全面的一本书了。工作之余仔细阅读,实践了书中的例子。这里列举出实验过程中发现的书中的一个正则表达式的问题。
书中第297页,在编写测试Jforum的回帖的脚本时,在取样器“进入版块”的正则表达式提取器“获取帖子ID”中用以下正则表达式来提取帖子ID:
href="/jforum2/posts/list/(.*).page
该正则表达式对取样器取到的网页源码进行匹配,把小括号中匹配到的内容存储在变量里。该正则表达式在大多数情况下表现正常,但是在有些情况下会出现错误。例如,当该取样器得到的网页里面含有如下的HTML内容时,即会出现匹配错误。
<a href="/jforum2/posts/list/5131.page">1</a>, <a href="/jforum2/posts/list/15/5131.page">2</a>
我们期望(.*)匹配到的只是帖子ID,如5131。但实际运行过程中发现他匹配到了“5131.page">1</a>, <a href="/jforum2/posts/list/15/5131”这么一长串的字符,显然就不是我们需要的了。
造成这种问题的就是正则表达式中 (.*) 这部分的贪婪匹配导致的。(.*)是尽可能多的去匹配。所以在上面的字符串中,该正则表达式的(.*)就会匹配到相距最远的 href="/jforum2/posts/list/ 和 .page 中的所有字符。
有两种解决方案,其一是强制不要贪婪匹配,另一种就是用匹配数字字符的表达式。
方案一:非贪婪模式匹配
非贪婪模式的匹配非常简单,直接在原有的pattern上加上一个?就可以了,意思是只匹配一次。修改后的正则为:
href="/jforum2/posts/list/(.*?).page
方案二:
匹配数字字符串,修改后的正则为:
href="/jforum2/posts/list/(\d+).page
经测试,修改后的正则表达式任何时候都能精确匹配到我们想要匹配的数字字符串。