2008-11-27 17 views
13

necesito probar una dirección URL que no se extremo con .aspExpresión regular para que coincida con una cadena (1+ caracteres) que no termina en .ext (extensión)

Así test, test.html y debe test.aspx coincidencia, pero test.asp no debe coincidir.

Lo normal sería probar si la url hace extremo con .asp y negar el hecho de que se correspondía con el operador no está en código:

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

En ese caso, la expresión regular, pero sería \.asp$ en este caso, necesito la expresión regular para dar como resultado una coincidencia.


Antecedentes: Necesito utilizar la expresión regular como un contraint ruta en el método de extensión ASP.NET MVC RouteCollection.MapRoute. La ruta debe coincidir con todos los controladores pero debería caer a través de cuando el controlador en la url termina con .asp

Respuesta

40

El truco es usar negative lookbehind.

Si necesita sólo un sí/no hay respuesta:

(?<!\.asp)$ 

Si usted necesita para que coincida con la URL completa:

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

Estas expresiones regulares funcionarán con cualquier URL en la que el nombre del archivo se produce en el final de la URL (es decir, URL sin una consulta o fragmento). Supongo que sus URL se ajustan a esta limitación dado el valor actual de .asp $ en su pregunta. Si quieres que funcione con todas las URL, intente esto:

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

O si desea la expresión regular para que coincida con la URL completa:

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

El segundo hizo el truco, parece que necesito hacer algunas pruebas con más urls, pero mi primera unidad ahora pasa, así que ¡gracias! –

+0

+1 para una buena información. Tiny nit pick: el título de la pregunta muestra "1+ characters" y creo que tus dos primeras expresiones regulares coincidirían con las cadenas vacías. –

+0

En el contexto de las restricciones de enrutamiento MVC de ASP.NET, la URL se inspecciona por partes: {controller}/{action}/{id} La expresión regular debe coincidir con la parte {controller}, por lo que "el final" no siempre ser el final de la url, pero el final de la {controller} parte del final. –

2

Prueba este

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

Esto funciona, pero es ineficiente. No es necesario verificar en cada posición que .asp $ no puede coincidir. Solo tenemos que hacer el control al final. –

+0

También funciona, le di la respuesta a Jan por ser más eficiente. Gracias! –

3

No es una expresión regular, pero el método String.EndsWith C# que fácilmente podría hacer el trabajo.

es decir

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

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

+1 por no pensar demasiado complicado ;-) – Treb

+0

No, -1 por no ser una expresión regular, disculpa por ser tan estricto ;-) –

+0

+1 por solución no complicada – Learning

Cuestiones relacionadas