4

一部の IIS Url Rewrites で使用する正規表現を設計しています。目的は、次の URL をキャプチャすることです。

  1. ルート ディレクトリ内の単なるファイル (ピリオドを含むことで識別) ではなく、
  2. クエリ文字列を含まず、かつ
  3. 特定のサブディレクトリのセット、特に「Account」と「Public」に属していない

私の現在の正規表現は次のようになります。

^(?!(Account)|(Public))([^./]+)(/[^?]*)?$

次のテスト セットでRegexPalを使用する:

file.aspx
Account/otherfile.aspx
Public/otherfile.aspx
otherfolder1/otherfile.aspx?stuff=otherstuff
otherfolder2/otherfolder/otherfile.aspx
otherfolder3/
otherfolder4

私の正規表現は最初の 2 つのケースを正しく無視しますが、3 番目のケースではまだ一致しています。ここでの先読みの何が問題になっていますか?

4

4 に答える 4

3

私は RegExPal で動作する何かを考え出そうとすることに抵抗できませんでした (成功しませんでした -編集: 検証されたばかりで、これは RegExPal で動作します) が、必要なことを行う別の方法としてこれをそこに投げ出すと思いました。少し理解しやすいかもしれません:

^(?!Account|Public|[a-zA-Z_0-9]+\.)[a-zA-Z_0-9/.]+$

説明:

^                   # start
(?!                 # open a negative lookahead
Account|Public|     # ignore both Account and Public
[a-zA-Z_0-9]+\.     # ignore files in root (i.e., letters/numbers, followed by period)
)                   # close negative lookahead
[a-zA-Z_0-9/.]+     # now match anything with letters/numbers, periods and slashes, but no '?' (ignores URLs with query string)
$                   # end
于 2012-04-20T22:29:03.760 に答える
1

slnによって報告されているように、 RegexPalでのこれらのテストの問題は、複数行のテストを実行すると、複数の行をグループ化して、そうでない場合は単一の一致を作成できることです。

正規表現は、それが実行するように設計されている目的には問題ありません。それは実際にはやり過ぎです。IISリライトおよびリダイレクトの場合、IIS URLリライトモジュールを使用している場合は、一致を受け入れる条件と受け入れない条件を指定するオプションがあります。それらのオプションのいくつかは次のとおりです。

  • アイテムは物理ファイルではありません
  • アイテムは物理ディレクトリではありません
  • アイテムが2次パターンと一致する(または一致しない)

これらは、ネガティブルックアヘッドよりも完全に望ましい効果を達成します。

于 2012-04-20T20:40:07.647 に答える
1

RegexPal は混乱していますが、本当の問題は正規表現が正しく設計されていないことです。

何をしようとしているのかはわかりませんが、複数行モードと正規表現内のアンカーを使用する場合は、特にそのように設計しない限り 、アンカーをオーバーフローさせ^$
ないように注意する必要があります。
これは貪欲/非貪欲量指定子の両方に適用されます。
負の先読み条件をミックスに投入すると、さらに悪化します。

この場合、RegexPal はおかしくなり、^
^ を再評価せずに前にバックトラックしたようです。ただし、これはおそらく JavaScript の問題ではありません。

消費クラスに not newline を追加すると、すべての問題が修正されます。
両方のクラスに追加する必要があります。

^(?!Account|Public)[^./\n]+(?:/[^?\n]*)?$
于 2012-04-21T00:36:45.193 に答える
0

^(?!Account|Public)([^\.\/]+\/[^\?]*)$正規表現を使いたかったのかもしれません。

こちらをご覧ください: http://ideone.com/q3lAv

次に、正しいRegExPalパターンは次のようになります^(?!Account|Public)([^\.\/]+\/[^\?\n]*)$


[アップデート]

ファイル名の名前にドットを含める必要はなく.、一方、フォルダー/ディレクトリ名には名前にドットを含めることが.できますが、7行目でも肯定的な一致が必要な場合は、パターン^(?!Account|Public)([^\.\/]+(?:\/[^\?]*|[^\.\?]*))$を使用する必要があります。 RegExPal パターンとしても機能するはずです。

こちらをご覧ください: http://ideone.com/VcmEP

于 2012-04-20T21:59:47.747 に答える