我正在尝试匹配不包含子字符串的字符串
我的字符串始终以“http://www.domain.com/”
开头我想从匹配项中排除的子字符串是字符串后面的“.a /”(域名中的文件夹名称)
我要排除的子字符串后面的字符串中会有字符
例如:
“http://www.domain.com/.a/test.jpg”不应该匹配
但是“http://www.domain.com/test.jpg”应该是
答案 0 :(得分:25)
答案 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
将通过测试,因为它不会以/
结尾。