2010-07-19 7 views
1

Je déteste absolument RegEx, j'ai vraiment besoin de l'apprendre - c'est tellement puissant. Voici la question:Une autre question RegEx

Je suis en train de réécrire les URL dans IIS, et j'ai ce RegEx par défaut:

^([^/]+)/?$ 

Toutefois, cela ne laisse les choses comme ça business/profile.html à travers, mais il laisse business-profile.html par .

Comment est-ce que je le change pour laisser passer le premier?

Merci

+0

Qu'est-ce que vous essayez de faire? Cela conduira à une meilleure réponse. –

+0

J'essaie d'ajouter des URLs conviviales à mon site Web, en utilisant la réécriture d'URL dans IIS 7. – bear

Répondre

3

Si vous voulez comprendre et apprendre Regex, apprendre à briser leur sens quand vous êtes confus quant à ce qu'ils font. Voici la même regex, en format développé.

^   # Start of the string 
(   # Take a group... 
    [^/]+ # of one or more characters (the +) that are NOT the/character 
)   # end of the group 
/?   # an optional '/' 
$   # End of string 

Donc cela correspond regex:

  • Toutes les chaînes qui n'ont pas le caractère / il
  • Toutes les chaînes qui contiennent une / unique à la fin de celui-ci

Pour "réparer" l'expression rationnelle, nous devons savoir ce que vous entendez par "laisser passer". Voulez-vous dire "correspondre à la regex?"

(Note:. Une grande ressource est http://www.regular-expressions.info/ - il offre une grande référence croisée d'outils et tutoriel pour regex)

+0

+1 pour préconiser une meilleure compréhension. –

+0

En laissant passer, je veux dire, correspondre à la RegEx – bear

+0

+ 1, Bien que nous ne capturons rien, un groupe non capturant serait mieux, peut-être que nous pouvons également faire une pré optimisation du moteur. – Anders

2

Le but de RE d'origine semble être « interdire toute URL avec des barres obliques à l'intérieur » (un à la fin est facultativement autorisé). Si votre but est "interdire absolument rien", ^(.*?)/?$ devrait fonctionner (avec le *? signifiant match non gourmand - dialectes RE diffèrent sur de telles choses avancées, donc je ne sais pas si le vôtre le soutiendra). @Wrikken a montré comment autoriser "au maximum un slash à l'intérieur", et généraliser clairement à "N slashes à l'intérieur" pour tout N fixé. Sans savoir exactement ce que vous voulez autoriser, et quoi interdire, il est difficile d'être plus utile! -)