0

我需要为 jMeter 测试排除一些 URL:

不排除:

http://foo/bar/is/valid/with/this
http://foo/bar/is/also/valid/with/that

排除:

http://foo/bar/is/not/valid/with/?=action
http://foo/bar/is/not/valid/with/?=action
http://foo/bar/is/not/valid/with/specialword

请帮我?

我的以下正则表达式不起作用:

foo/(\?=|\?action|\?form_action|specialword).*
4

4 回答 4

2

第一个问题:/是通用分隔符,所以使用\/或更改分隔符进行转义。第二个问题:它只会匹配foo/action等等,你需要在括号前包含一个通配符:foo\/.*(\?=|\?action|\?form_action|specialword).*

所以:

/foo\/.*(\?=|\?action|\?form_action|specialword).*/

下一个问题是这将匹配相反的内容:您的排除。你可以微调你的正则表达式来做相反的事情,或者你可以用你的语言处理这个(即如果没有匹配,做这个和那个)。

始终注意正则表达式中的特殊字符。也见这里

于 2012-05-10T15:51:18.340 回答
1

有无数种方法可以用正则表达式击中自己的脚。您可以在循环中使用 /g 和 /c 编写某种“解析器”,但何必呢?您似乎已经在使用当前的正则表达式时遇到了问题。

把问题分解成更小的部分,一切都会变得不那么复杂。您可以为自己编写某种过滤器grep例如:

sub filter {
    my $u = shift;
    my $uri = URI->new($u);
    return undef if $uri->query;
    return undef if grep { $_ eq 'specialword' } $uri->path_segments;
    return $u;
}

say for grep {filter $_} @urls;

我不会那么坚持正则表达式,特别是如果其他人也必须阅读代码......

于 2012-05-10T16:27:18.897 回答
0

将正则表达式分隔符更改为“/”以外的其他内容,这样您就不必在匹配项中对其进行转义。你可能会这样做:

m{//foo/.+(?:\?=action|\?form_action|specialword)$};

?: 表示仅分组。

使用它,您可以说:

print unless m{//foo/.+(?:\?=action|\?form_action|specialword)$};
于 2012-05-10T16:15:40.310 回答
0

你的交替是错误的。foo/(\?=|\?action|\?form_action|specialword)匹配任何一个

  • foo/?=
  • foo/?action
  • foo/?form_action
  • foo/?specialword

所以你需要

m{foo/.*(?:\?=action|\?=form_action|specialword)}

.*必要考虑到可能bar/is/valid/with/this发生的情况/foo/

请注意,我已将您更改( .. )为非捕获(?: .. ),并且我使用大括号作为正则表达式分隔符以避免必须转义表达式中的斜杠。

最后,您需要编写

unless ($url =~ m{/foo/.*(?:\?=action|\?=form_action|specialword)}) { ... }

或者

if ($url !~ m{/foo/.*(?:\?=action|\?=form_action|specialword)}) { ... }

因为正则表达式匹配要丢弃的 URL 。

于 2012-05-10T16:20:42.083 回答