2011-03-25 335 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將通過測試,因爲它不與/結束。

相關問題