2012-04-01 23 views
4

少し前に正規表現を使って特定のディレクトリのURLから一致を抽出することについて質問しました。正規表現を使用してディレクトリを除外するにはどうすればよいですか?

例:与えられたwww.domain.com/shop/widgets/match/

ソリューションは、これは"match"

は、しかし、私のファイル構造が変更されたと私は今、その代わり"pages"除く任意のディレクトリに"match"を返す式が必要に返す^/shop.*/([^/]+)/?$

ましたと"system"

基本的に私は01を返す式が必要です私は運なし日間苦労してきた

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

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

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

ではなく、次のために。

おかげ

+4

2つの正規表現を使用するだけでなく、URLに "pages"や "system"という単語が含まれているかどうかを確認することもできます。 –

+0

'^/shop。* /([^ /] +)/?$'は 'www.domain.com/shop/widgets/match /'とまったく一致しません。しかし、それは '/ shop/widgets'にマッチします。 \/[a-z0-9 .-] + \/shop \/[^ \ /] + \ /([^ \ /] +)\/$/'を使用して、そのURLから「一致」を抽出することができますセグメントを '\ 1'とします。区切り文字としてスラッシュも使用しているので、スラッシュをエスケープしています。デリミタを必要としない場合は、スラッシュをエスケープする必要はありません。 – Graham

+0

@jbねえ、これはいい考えです。私はそれを与えるだろう。しかし、私はそれが1つの表現でどのように行われているか見たいと思っています。 – Matt

答えて

2

は、これは上記のグラハム偉大な答えにちょうど代替手段です。 (しかし、問題ではありません正規表現の部分、FOT)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(); 
} 

/ハンス

2

BREとEREは、正方形内を除き、REの部分を否定するための方法を提供していません。ブラケット式。つまり、[^a-z]にできますが、/(abc|def)/ではありません。あなたの正規表現ダイヤルがEREの場合、 2正規表現を使用する必要があります。 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]); 
} 

そして出力:

[[email protected] ~]$ ./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/   

あなたが探しているものということですか?

関連する問題