我的网站上有一个可能的网址列表,例如
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之类
的东西是错的。
有什么帮助吗?谢谢
问问题
999 次
2 回答
2
您应该检查它不是People
或Groups
在开头:
(?!People|Groups)(.*)
目前,您正在检查正则表达式后面没有People
or Groups
。
根据您使用的语言/框架,您可能还需要使用^
并$
确保匹配整个字符串:
^(?!People|Groups)(.*)$
您还应该考虑是否要匹配以 开头的 url People
,例如。http://dev.site.com/People2/
. 所以这可能会更好:
^(?!(?:People|Groups)(?:/|$))(.*)$
它检查负匹配People
或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 回答