Регулярное выражение для соответствия строке (1+ символов), которая НЕ заканчивается на .ext (расширение) - PullRequest
13 голосов
/ 27 ноября 2008

Мне нужно проверить URL, чтобы он не заканчивался .asp

Так что test, test.html и test.aspx должны совпадать, но test.asp не должны совпадать.

Обычно вы проверяете, заканчивается ли URL на .asp, и сводит на нет тот факт, что он соответствует с помощью оператора NOT в коде:

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

В этом случае регулярное выражение будет \.asp$, но в этом случае мне нужно, чтобы регулярное выражение приводило к совпадению.


Справочная информация. Мне нужно использовать регулярное выражение в качестве ограничения маршрута в методе расширения ASP.NET MVC RouteCollection.MapRoute. Маршрут должен соответствовать всем контроллерам, но он должен проваливаться, когда контроллер в URL-адресе заканчивается на .asp

Ответы [ 3 ]

40 голосов
/ 27 ноября 2008

Хитрость в том, чтобы использовать негативный взгляд за спиной .

Если вам нужен только ответ да / нет:

(?<!\.asp)$

Если вам нужно сопоставить весь URL:

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

Эти регулярные выражения будут работать с любым URL-адресом, имя файла которого находится в конце URL-адреса (т.е. URL-адреса без запроса или фрагмента) Я предполагаю, что ваши URL соответствуют этому ограничению, учитывая регулярное выражение .asp $ в вашем вопросе. Если вы хотите, чтобы он работал со всеми URL, попробуйте это:

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

Или это, если вы хотите, чтобы регулярное выражение соответствовало всему URL:

^[^#?]+(?<!\.asp)([#?].+|$)
3 голосов
/ 27 ноября 2008

Не регулярное выражение, а метод c # String.EndsWith, который может легко выполнить эту работу.

е

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

test1.EndsWith(".asp") // true;
test2.EndsWith(".asp") // false ;
2 голосов
/ 27 ноября 2008

Попробуйте это

^((?!\.asp$).)*$
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...