2010-11-09 15 views
1

J'ai des problèmes avec une regex, donc j'ai pensé que je demanderais ici. Fondamentalement, j'en ai besoin pour faire correspondre les URI pour une collection, sauf pour une certaine (/new).Simple négation de regex

-à-dire:

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

J'ai essayé des variations sur ce qui suit, en vain:

/properties(^(/new)).* 

Je pense que mon problème est avec la négation, mais je ne peux pas tout à fait ce que grok Je suis censé faire .. Une explication avec la solution serait très appréciée!

+3

'^' signifie que la négation dans '[]'. Normalement, cela signifie "début de ligne". – sepp2k

+1

@ sepp2k: ... et seulement s'il est utilisé immédiatement après l'ouverture '['. – Gumbo

Répondre

1

^ nie l'intérieur d'une classe de caractères (un groupe de caractères dans un ordre quelconque entouré [ ]. Vous ne devriez pas vous devez utiliser ?!. Utiliser .*. Il n'ajoute rien. Si vous voulez correspondre à quelque chose que vous juste ne rien mettre :). De plus, vous n'avez pas besoin de capturer le match. Selon la façon dont vous sa mise en place, vous devrez peut-être échapper aux barres obliques (/)

Essayez ceci:

\/properties(?!\/new)

+0

LTS⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠! – tchrist

+0

Parfait, merci! – Jeriko

+0

@tchrist, LTS ?? – Jeriko

0

Vous pouvez simplement utiliser un RewriteCond supplémentaire:

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

Cela correspondra /properties, /properties/ et /properties/… suivi par toute autre chose, mais pas /properties/new.

0

Que diriez-vous celui-ci:

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

le: `(/ new!) Est une recherche directe négative, et dit en substance: assurez-vous que cela ne peut pas être adapté

ce qui suit: (? : /.+) {0,1} permet de faire correspondre des chemins supplémentaires (c'est-à-dire/25) et est un groupe non-capturant qui dit match/suivi de zéro ou plusieurs caractères, et le fait correspondre à zéro à une fois en tant que groupe. Le {0,1} lui permet de correspondre même s'il n'y a pas de/25.

+1

Vous n'avez pas besoin de '(?: /.*) {0,1}. Si vous n'essayez pas de capturer, laisser le champ vide est tout ce que vous avez à faire. Chaque partie d'une regex est une règle. Si toutes les règles indiquent une correspondance et qu'il n'y a plus de règles, alors le moteur montrera que la ligne correspond. Aussi. * N'est jamais une bonne idée. – Cfreak

+0

Bon point, le regard vers l'avant sur le '/ new' est tout ce dont il a besoin pour empêcher ce match. Merci pour le conseil. – CodingGorilla