我在网站上列出了可能的网址
1 http://dev.site.com/People/
2 http://dev.site.com/People
3 http://dev.site.com/Groups/
4 http://dev.site.com/Groups
5 http://dev.site.com/
6 http://dev.site.com/[extraword]
我希望能够匹配所有的网址,如6,并将它们重定向到
http://dev.site.com/?Shorturl=extraword
但我不想重定向前5个网址
我尝试了类似的东西
((*)(?!人物|组)个)\ r
但是出了点问题。
任何帮助?
感谢
答案 0 :(得分:2)
您应该在开始时检查它不是People
或Groups
:
(?!People|Groups)(.*)
目前您正在检查正则表达式是否未跟People
或Groups
。
根据您使用的语言/框架,您可能还需要使用^
和$
来确保您匹配整个字符串:
^(?!People|Groups)(.*)$
您还应该考虑是否要匹配以People
开头的网址,例如。 http://dev.site.com/People2/
。所以这可能会更好:
^(?!(?:People|Groups)(?:/|$))(.*)$
它会检查People
或Groups
的否定匹配是否跟着网址的结尾或斜杠。
您可能希望确保不匹配空字符串,因此请使用.+
代替.*
:
^(?!(?:People|Groups)(?:/|$))(.+)$
如果你想要一个没有任何斜线的单词:
^(?!(?:People|Groups)(?:/|$))([^/]+)$
答案 1 :(得分: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