0

私は過去数時間、この正規表現を正しく取得しようと試みてきましたが、残念ながら、それでも取得できません。既存のスレッドも検索しようとしましたが、サイコロはありませんでした。:(

正規表現を次の可能な文字列に一致させたいのですが。

userprofile?id=123
profile
search?type=player&gender=male
someotherpage.htm

だがしかし

userprofile/
helloworld/123

基本的に、正規表現は英数字?、=、&などのURL演算子と一致させたいのですが、スラッシュは一致させません。(つまり、文字列にスラッシュが含まれている限り、正規表現は0個の一致を返す必要があります。)

次の正規表現を試しましたが、どれも機能しないようです。

([0-9a-z?=.]+)
(^[^\/]*$[0-9a-z?=.]+)
([0-9a-z?=.][^\/]+)
([0-9a-z?=.][\/$]+)

どんな助けでも大歓迎です。どうもありがとう!

4

2 に答える 2

0

これでうまくいくはずです:

/\w+(\.htm|\?\w+=\w*(&\w+=\w*)*)?$/i

これを分解するには:

\w+              // Match [a-z0-9_] (1 or more), to specify resource
  (              // Alternation group (i.e., a OR b)
    \.htm        // Match ".htm"
    |            // OR
    \?           // Match "?"
    \w+=\w*      // Match first term of query string (e.g., something=foo)
    (&\w+=\w*)*  // Match remaining terms of query string (zero or more)
  )
?                // Make alternation group optional
$                // Anchor to end of string

iフラグは大文字と小文字を区別しないためのものです。

于 2013-03-11T10:32:59.140 に答える
0

それらがすべて一致する理由は、正規表現が文字列の一部に一致し、文字列全体に一致する必要があることを伝えていないためです。文字列のどこにも他の文字を許可しないようにする必要があります。

^[0-9a-z&?=.]+$

これをテストするための小さな perl スクリプトを次に示します。

#!/usr/bin/perl

my @testlines = (
         "userprofile?id=123",
         "userprofile",
         "userprofile?type=player&gender=male",
         "userprofile.htm",
         "userprofile/",
         "userprofile/123",
        );

foreach my $testline(@testlines) {
  if ($testline =~ /^[0-9a-z&?=.]+$/) {
    print "$testline matches\n";
  } else {
    print "$testline doesn't match - bad regexp, no cookie\n";
  }
}
于 2013-03-11T10:39:55.440 に答える