2


1 http://dev.site.com/People/
2 http://dev.site.com/People
3 http://dev.site.com/Groups/のような私のサイトで可能な URL のリストがあり ます。
4 http://dev.site.com/Groups
5 http://dev.site.com/
6 http://dev.site.com/[補足]

6 とそれらを
http://dev.site.com/?Shorturl=extraword

にリダイレクトします が、最初の 5 つの URL をリダイレクトしたくありません ((.*)(?!People|Groups))\r

などを試しまし たが、何か間違っている。 助けはありますか?ありがとう



4

2 に答える 2

2

そうでないPeopleGroups、最初にチェックを入れる必要があります。

(?!People|Groups)(.*)

現時点では、正規表現の後にPeopleorが続いていないことを確認していますGroups

使用している言語/フレームワークによっては、文字列全体と一致していることを確認するために^andも使用する必要がある場合があります。$

^(?!People|Groups)(.*)$

で始まる URL に一致させるかどうかについても検討する必要がありますPeoplehttp://dev.site.com/People2/. したがって、これはより良いかもしれません:

^(?!(?:People|Groups)(?:/|$))(.*)$

Peopleorの否定的な一致のGroups後に URL の末尾またはスラッシュが続くことを確認します。

空の文字列と一致しないことを確認したい場合があるため、.+代わりに.*次を使用します。

^(?!(?:People|Groups)(?:/|$))(.+)$

スラッシュなしの単語が必要な場合は、次のようにします。

^(?!(?:People|Groups)(?:/|$))([^/]+)$
于 2009-06-28T17:52:32.910 に答える
1

正規表現では、(.*)サブパターンが文字列全体を消費するため、否定先読みが成功します。

People|Groups を除外するには、否定的な先読みが必要です。次に、余分な単語をキャプチャする必要があります (単語には何かが含まれている必要があります。そうでない場合は、一致を失敗させます)。ここで重要な点は、否定先読みは文字列をまったく消費しないため、作成しようとしているリダイレクト URL で後で使用するために余分な単語をキャプチャできることです。

これは Perl での解決策ですが、このアプローチは C# でも機能するはずです。

use warnings;
use strict;

while (<DATA>){
    print "URL=$1  EXTRA_WORD=$2\n"
        if /^(.*)\/(?!People|Groups)(\w+)\/?$/;
}

__DATA__
http://dev.site.com/People/
http://dev.site.com/People
http://dev.site.com/Groups/
http://dev.site.com/Groups
http://dev.site.com/
http://dev.site.com/extraword1
http://dev.site.com/extraword2/

出力:

URL=http://dev.site.com  EXTRA_WORD=extraword1
URL=http://dev.site.com  EXTRA_WORD=extraword2
于 2009-06-29T03:33:34.057 に答える