我刚才问了一个关于使用正则表达式从特定目录中的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/
我一直在挣扎好几天没有运气。
由于
答案 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/
这就是你要找的东西吗?