регулярное выражение для разбора коротких URL - PullRequest
2 голосов
/ 28 июня 2009

У меня есть список возможных 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]

Я хочу иметь возможность сопоставить все URL-адреса, например 6, и перенаправить их на
http://dev.site.com/?Shorturl=extraword

но я не хочу перенаправлять первые 5 URL

Я пробовал что-то вроде
((*). (?! Люди | Группа)) \ г

но что-то не так.
любая помощь? спасибо

Ответы [ 2 ]

2 голосов
/ 28 июня 2009

Вы должны поставить проверку, что это не People или Groups в начале:

(?!People|Groups)(.*)

В данный момент вы проверяете, что за регулярным выражением не следует People или Groups.

В зависимости от того, какой язык / рамки вы используете, вам также может понадобиться использовать ^ и $, чтобы убедиться, что вы соответствуете всей строке:

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

Вам также следует подумать, хотите ли вы сопоставить URL-адреса, начинающиеся с People, например. http://dev.site.com/People2/. Так что это может быть лучше:

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

Проверяет, что после отрицательного совпадения для People или Groups следует конец URL или косой черты.

Возможно, вы захотите убедиться, что вы не соответствуете пустой строке, поэтому используйте .+ вместо .*:

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

А если вам нужно слово без косой черты:

^(?!(?:People|Groups)(?:/|$))([^/]+)$
1 голос
/ 29 июня 2009

В вашем регулярном выражении подшаблон (.*) потребляет всю строку, что приводит к успешному завершению отрицательного просмотра.

Вам нужен негативный взгляд на исключение людей | групп, а затем вам нужно захватить лишнее слово (и в слове должны быть какие-то слова, иначе мы хотим, чтобы совпадение не получилось). Ключевым моментом здесь является то, что отрицательный взгляд не использует ни одной строки, поэтому вы можете захватить дополнительное слово для последующего использования в 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
...