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

Мне нужно проверить 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 ответа

Фокус в том, чтобы использовать отрицательный lookbehind.

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

(?<!--\.asp)$
</code-->
<p>Если вам нужно сопоставить весь URL-адрес:</p> <pre class="prettyprint linenums">^.*(?&lt;!--\.asp)$ &lt;/code--&gt;</pre><code> <p>Эти регулярные выражения будут работать с любым URL-адресом, где имя файла встречается в конце URL-адреса (т.е. URL-адреса без запроса или фрагмента). Я предполагаю, что ваши URL-адреса соответствуют этому ограничению с учетом регулярного выражения .asp $в вашем вопросе. Если вы хотите, чтобы он работал со всеми URL-адресами, попробуйте следующее:</p> <pre class="prettyprint linenums">^[^#?]+(?&lt;!--\.asp)([#?]|$) &lt;/code--&gt;</pre><code> <p>Или это, если вы хотите, чтобы регулярное выражение соответствовало всему URL-адресу:</p> <pre class="prettyprint linenums">^[^#?]+(?&lt;!--\.asp)([#?].+|$) &lt;/code--&gt;</pre>


Не regexp, а С# String.EndsWith метод, который мог бы легко выполнить задание.

т

string test1 = "me.asp" ;
string test2 = "me.aspx" ;
test1.EndsWith(".asp") // true;
test2.EndsWith(".asp") // false ;


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

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

licensed under cc by-sa 3.0 with attribution.