2010-11-09 71 views
1

我遇到了一個正則表達式的問題,所以我想我會問這裏。基本上,我需要它匹配一個集合的URI,除了某個(/new)。簡單的正則表達式否定

即:

/properties  # match 
/properties/25 # match 
/properties/new # rejected 

我已經試過以下變化,但無濟於事:

/properties(^(/new)).* 

我覺得我的麻煩是否定的,但我不能完全神交什麼我打算這樣做..解決方案的解釋將非常感謝!

+3

''^僅意味着內部'[]'否定。通常這意味着「開始行」。 – sepp2k 2010-11-09 15:14:15

+1

@ sepp2k:...只有在開啓後立即使用'['。 – Gumbo 2010-11-09 15:20:02

回答

1

^否定字符類(按照任何順序一組字符由[ ]包圍中,你需要使用?!,也不宜使用.*,不添加任何東西。如果你想給你匹配任何只是不要放任何東西:)。你也不需要捕捉比賽。取決於你如何設置它,你可能還需要躲避斜槓(/

試試這個:

\/properties(?!\/new)

+0

LTS⁠⁠⁠⁠⁠⁠⁠⁠⁠!!!!! – tchrist 2010-11-09 23:42:30

+0

完美,謝謝! – Jeriko 2010-11-10 08:08:53

+0

@tchrist,LTS ?? – Jeriko 2010-11-10 08:09:50

0

你可以簡單地使用一個額外的RewriteCond

RewriteCond $2 !=new 
RewriteRule ^/properties(/(.*))?$ … 

這將匹配/properties/properties//properties/…其次是任何東西,但不/properties/new

0

這個怎麼樣:

/properties(?!/new)(?:/.*){0,1} 

的:`(/新?!)是負正向查找,並且實際上是說:要確保這個不能匹配

如下:(? :/.+){0,1}允許匹配其他路徑(即./25),並且是一個非捕獲組,表示匹配/後跟零個或多個字符,並將其匹配爲0到1次組。即使沒有/ 25,{0,1}也可以匹配。

+1

你不需要'(?:/.*){0,1}。如果你不想捕捉,留下空白就是你所要做的。正則表達式的每個部分都是一個規則。如果所有規則都表示匹配並且沒有更多規則,那麼引擎將顯示該行匹配。另外。*從來不是一個好主意。 – Cfreak 2010-11-09 15:26:16

+0

好的一點,'/ new'的前瞻性是他需要防止這種匹配的。謝謝你的提示。 – CodingGorilla 2010-11-09 15:28:18