2

我的网站上有一个可能的网址列表,例如
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 个 url

我尝试过类似
((.*)(?!People|Groups))\r之类

的东西是错的。
有什么帮助吗?谢谢

4

2 回答 2

2

您应该检查它不是PeopleGroups在开头:

(?!People|Groups)(.*)

目前,您正在检查正则表达式后面没有Peopleor Groups

根据您使用的语言/框架,您可能还需要使用^$确保匹配整个字符串:

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

您还应该考虑是否要匹配以 开头的 url People,例如。http://dev.site.com/People2/. 所以这可能会更好:

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

它检查负匹配PeopleGroups后跟 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 回答