tags:

views:

203

answers:

2

I've a list of possible urls on my site like
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]

I want to be able to match all the urls like 6 and redirect them to
http://dev.site.com/?Shorturl=extraword

but I don't want to redirect the first 5 urls

I tried something like
((.*)(?!People|Groups))\r

but something is wrong.
any help? thanks

+2  A: 

You should put the check that it isn't People or Groups at the start:

(?!People|Groups)(.*)

At the moment you're checking that the regular expression isn't followed by People or Groups.

Depending on which language/framework you're using, you might also need to use ^ and $ to make sure you're matching the whole string:

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

You should also think about whether you want to match urls that begin with People, eg. http://dev.site.com/People2/. So this might be better:

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

It checks that a negative match for People or Groups is followed by the end of the url or a slash.

You might want to make sure you don't match an empty string, so use .+ instead of .*:

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

And if you want a word without any slashes:

^(?!(?:People|Groups)(?:/|$))([^/]+)$
Daniel James
I've tried all your examples (in C#) and none of them work - they all lead to all the strings matching :/
womp
I think he's just matching the path part of the URL.
Daniel James
+1  A: 

In your regex, the (.*) subpattern consumes the entire string, which then causes the negative lookahead to succeed.

You need a negative lookahead to exclude People|Groups, and then you need to capture the extra word (and the word needs to have some stuff in it, otherwise we want the match to fail). The crucial piece here is that the negative lookahead does not consume any of the string, so you are able to capture the extra word for subsequent use in the redirect URL you are trying to build.

Here's a solution in Perl, but the approach should work for you in 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/

Output:

URL=http://dev.site.com  EXTRA_WORD=extraword1
URL=http://dev.site.com  EXTRA_WORD=extraword2
FM
We have a winner!
womp