2008-11-27 5 views
13

je dois tester une URL qu'il ne fin avec .aspExpression régulière pour correspondre à une chaîne (1+ caractères) qui ne se termine pas dans .ext (extension)

Alors test, test.html et test.aspx devrait correspondre, mais test.asp ne devrait pas correspondre.

Normalement, vous souhaitez tester si l'URL fait fin avec .asp et rien au fait qu'il correspond à l'aide l'opérateur NOT dans le code:

if(!regex.IsMatch(url)) { // Do something } 

Dans ce cas, l'expression régulière serait \.asp$ mais dans ce cas j'ai besoin de l'expression régulière pour aboutir à une correspondance.


Contexte: Je dois utiliser l'expression régulière comme dans l'itinéraire contraint la méthode d'extension ASP.NET MVC RouteCollection.MapRoute. La route doit correspondre à tous les contrôleurs mais il devrait tomber à travers lorsque le contrôleur dans l'url se termine par .asp

Répondre

40

L'astuce consiste à utiliser negative lookbehind.

Si vous avez juste besoin d'une réponse oui/non:

(?<!\.asp)$ 

Si vous devez faire correspondre l'URL complète:

^.*(?<!\.asp)$ 

Ces regexes travailleront avec une URL où le nom du fichier se produit à la fin de l'URL (c'est-à-dire les URL sans requête ou fragment). Je suppose que vos URL correspondent à cette limitation étant donné le regex .asp $ dans votre question. Si vous voulez travailler avec toutes les URL, essayez ceci:

^[^#?]+(?<!\.asp)([#?]|$) 

Ou si vous voulez que le regex pour correspondre à l'URL complète:

^[^#?]+(?<!\.asp)([#?].+|$) 
+0

La seconde a fait l'affaire, il faut que je fasse quelques tests avec plus d'urls, mais mes premiers tests unitaires passent maintenant, alors merci! –

+0

+1 pour de bonnes informations. Tiny nit pick: le titre de la question note "1+ caractères" et je crois que vos deux premières regex correspondraient à des chaînes vides. –

+0

Dans le contexte des contraintes de routage ASP.NET MVC, l'URL est inspectée en plusieurs parties: {controller}/{action}/{id} La regex doit correspondre à la partie {controller}, donc 'la fin' ne sera pas toujours être la fin de l'url, mais la fin de la partie {controller} de la fin. –

2

Essayez cette

^((?!\.asp$).)*$ 
+0

Cela fonctionne, mais est inefficace. Il n'est pas nécessaire de vérifier à chaque position que .asp $ ne peut pas correspondre. Nous avons seulement besoin de faire le contrôle à la fin. –

+0

Fonctionne aussi bien, j'ai donné la réponse à Jan pour être plus efficace. Merci! –

3

Pas regexp, mais C# méthode String.EndsWith ce qui pourrait facilement faire le travail.

-à-dire

string test1 = "me.asp" ; 
string test2 = "me.aspx" ; 

test1.EndsWith(".asp") // true; 
test2.EndsWith(".asp") // false ; 
+0

+1 pour ne pas penser trop compliqué ;-) – Treb

+0

Non, -1 pour ne pas être une expression régulière, désolé d'être si strict ;-) –

+0

+1 pour une solution non compliquée – Learning

Questions connexes