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
などを試しまし
たが、何か間違っている。
助けはありますか?ありがとう
2 に答える
そうでないPeople
かGroups
、最初にチェックを入れる必要があります。
(?!People|Groups)(.*)
現時点では、正規表現の後にPeople
orが続いていないことを確認していますGroups
。
使用している言語/フレームワークによっては、文字列全体と一致していることを確認するために^
andも使用する必要がある場合があります。$
^(?!People|Groups)(.*)$
で始まる URL に一致させるかどうかについても検討する必要がありますPeople
。http://dev.site.com/People2/
. したがって、これはより良いかもしれません:
^(?!(?:People|Groups)(?:/|$))(.*)$
People
orの否定的な一致のGroups
後に URL の末尾またはスラッシュが続くことを確認します。
空の文字列と一致しないことを確認したい場合があるため、.+
代わりに.*
次を使用します。
^(?!(?:People|Groups)(?:/|$))(.+)$
スラッシュなしの単語が必要な場合は、次のようにします。
^(?!(?:People|Groups)(?:/|$))([^/]+)$
正規表現では、(.*)
サブパターンが文字列全体を消費するため、否定先読みが成功します。
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