正则表达式来解析短网址

时间:2009-06-28 17:46:56

标签: regex short-url

我在网站上列出了可能的网址
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

但是出了点问题。
任何帮助? 感谢

2 个答案:

答案 0 :(得分:2)

您应该在开始时检查它不是PeopleGroups

(?!People|Groups)(.*)

目前您正在检查正则表达式是否未跟PeopleGroups

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

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

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

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

它会检查PeopleGroups的否定匹配是否跟着网址的结尾或斜杠。

您可能希望确保不匹配空字符串,因此请使用.+代替.*

^(?!(?: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
相关问题