正则表达式字符串不包含子字符串

时间:2011-03-25 12:45:17

标签: regex string substring

我正在尝试匹配不包含子字符串的字符串

我的字符串始终以“http://www.domain.com/”

开头

我想从匹配项中排除的子字符串是字符串后面的“.a /”(域名中的文件夹名称)

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

例如:

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

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

4 个答案:

答案 0 :(得分:25)

使用否定先行断言:

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

Rubular Link

部分(?!\.a/)匹配.a/

以外的任何内容

答案 1 :(得分:7)

我在这种情况下的建议不是构建过于复杂的正则表达式,这些正则表达式具有负面的先行断言或类似的东西。
保持简单和愚蠢!
做2个匹配,一个用于肯定,然后排除负面(或反过来)。大多数情况下,正则表达式变得更容易,即使不是微不足道的。 而且你的程序越来越清晰 例如,要使用foo而不是foobar提取所有行,我使用:

grep foo | grep -v foobar

答案 2 :(得分:0)

我会尝试

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

您希望匹配您的域名,以及所有不继续使用的域名。以及继续使用的所有内容。但不是a。 (最后你可以添加/如果需要的话)

答案 3 :(得分: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将通过测试,因为它不会以/结尾。