2011-03-25 274 views
12

我试图以匹配不包含子正则表达式的字符串不包含子串

我的字符串开头总是“http://www.domain.com/”

我想要的子字符串从比赛排除是名为“.a /”,它后面的字符串来(文件夹名称的域名)

会有字符串中的字符的字符串后,我要排除

例如:

“http://www.domain.com/.a/test.jpg” 不应该匹配

但 “http://www.domain.com/test.jpg” 应该是

回答

25

使用式断言为:

^http://www\.domain\.com/(?!\.a/).*$ 

Rubular Link

的部分(?!\.a/)匹配任何东西除.a/

+0

如果我想用引号(“)完成匹配怎么办?当我通过HTML搜索时。 – 2011-03-25 13:32:47

0

我会尝试与

^http:\/\/www\.domain\.com\/([^.]|\.[^a]).*$ 

你想匹配你的域名,加上一切不会继续a。并且所有的事情都会继续。但不是a。 (最终你可以添加你/如果需要之后)

+1

这是好的 - 直到*另一个*程序员被要求扩展它也排除.b,.c和.whatElsethemanagementdoesnotwant – Ingo 2011-03-25 12:55:05

+0

是的......我得到@Ingo。顺便说一句我忘记了\之前/ – 2011-03-25 12:59:49

5

我在这种情况下的建议不是构造过度复杂的正则表达式whith消极lookahead断言或这样的东西。
保持简单和愚蠢!
做2个匹配,一个匹配积极的东西,稍后挑出底片(或其他方式)。大多数时候,正则表达式变得更容易,如果不是微不足道的话。 而你的程序变得更清晰。
例如,提取以foo的所有行,但没有取得foobar,我用:

grep foo | grep -v foobar 
0

如果您不使用向前看,但只是简单正则表达式,你就可以说,如果它符合你的域,但不以.a/

<?php 

function foo($s) { 

    $regexDomain = '{^http://www.domain.com/}'; 
    $regexDomainBadPath = '{^http://www.domain.com/\.a/}'; 

    return preg_match($regexDomain, $s) && !preg_match($regexDomainBadPath, $s); 
} 

var_dump(foo('http://www.domain.com/')); 
var_dump(foo('http://www.otherdomain.com/')); 

var_dump(foo('http://www.domain.com/hello')); 
var_dump(foo('http://www.domain.com/hello.html')); 
var_dump(foo('http://www.domain.com/.a')); 
var_dump(foo('http://www.domain.com/.a/hello')); 
var_dump(foo('http://www.domain.com/.b/hello')); 
var_dump(foo('http://www.domain.com/da/hello')); 

?> 

音符匹配http://www.domain.com/.a将通过测试,因为它不与/结束。

相关问题