如何使用正则表达式排除目录?

时间:2012-04-01 04:10:32

标签: regex

我刚才问了一个关于使用正则表达式从特定目录中的URL中提取匹配的问题。

例如:www.domain.com/shop/widgets/match/

给出的解决方案是^/shop.*/([^/]+)/?$

这将返回"match"

但是,我的文件结构已更改,我现在需要一个表达式,而不是在"match""pages"

之外的任何目录中返回"system"

基本上我需要一个表达式,它将为以下内容返回"match"

www.domain.com/shop/widgets/match/
www.domain.com/match/

但不是:

www.domain.com/pages/widgets/match/
www.domain.com/pages/

www.domain.com/system/widgets/match/
www.domain.com/system/

我一直在挣扎好几天没有运气。

由于

2 个答案:

答案 0 :(得分:2)

这只是Grahams上面的一个很好的答案。 C#中的代码(但是正则表达式部分,无关紧要):

void MatchDemo()
{
    var reg = new Regex("(                  "   +
                        "   (\\w+[.])       "   +
                        "   |               "   +
                        "   (\\w+[/])+      "   +
                        ")                  "   +
                        "(shop[/]|\\w+[/])  "   +               //the URL-string must contain the sequence "shop"
                        "(match)            "   ,
                        RegexOptions.IgnorePatternWhitespace);

    var url = @"www.domain.com/shop/widgets/match/";

    var retVal = reg.Match(url).Groups[5];                      //do we have anything in the fifth parentheses?

    Console.WriteLine(retVal);
    Console.ReadLine();
}

/汉斯

答案 1 :(得分:2)

BRE和ERE不提供否定RE的一部分的方法,除了方括号表达式之外。也就是说,您可以[^a-z],但不能表达而不是/(abc|def)/ 。如果你的正则表达式是ERE,那么你必须使用两个正则表达式。如果你正在使用PREG,你可以使用负面预测。

例如,这里有一些PHP:

#!/usr/local/bin/php
<?php

$re = '/^www\.example\.com\/(?!(system|pages)\/)([^\/]+\/)*([^\/]+)\/$/';

$test = array(
    'www.example.com/foo/bar/baz/match/',
    'www.example.com/shop/widgets/match/',
    'www.example.com/match/',
    'www.example.com/pages/widgets/match/',
    'www.example.com/pages/',
    'www.example.com/system/widgets/match/',
    'www.example.com/system/',
);

foreach ($test as $one) {
    preg_match($re, $one, $matches);
    printf(">> %-50s\t%s\n", $one, $matches[3]);
}

输出:

[ghoti@pc ~]$ ./phptest
>> www.example.com/foo/bar/baz/match/                   match
>> www.example.com/shop/widgets/match/                  match
>> www.example.com/match/                               match
>> www.example.com/pages/widgets/match/                 
>> www.example.com/pages/                               
>> www.example.com/system/widgets/match/                
>> www.example.com/system/        

这就是你要找的东西吗?