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

最初/の問題:一般的な区切り文字なので、区切り文字でエスケープする\/か、区切り文字を変更します。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 に答える