2010-11-09 73 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