request.serverVariables () “URL” по сравнению с “Script_Name”

Вы не должны слишком беспокоиться о шагах, которые вы видите на regex101.com, потому что библиотека C # regex очень надежна. Если вы протестируете простое регулярное выражение, например (?s)a.*?b, в regex101 с очень длинной строкой, оно сообщит о катастрофическом возврате, в то время как в коде C # будет работать нормально.

Существует способ улучшить ваш шаблон, поскольку он имеет некоторую избыточность: см. Повторяющийся шаблон \d+\s+[-].

Все, что вам нужно, это

\d+\s+-.*?(?=\s+-|$)

См. Демонстрацию regex на regex101 и RegexStorm .

Если .*?(?=\s+-) должно совпадать только при наличии пробела после -, используйте

\d+\s+-(?:\s.*?(?=\s+-)|.+)

См. Еще одну демонстрацию 1 (меньше шагов :)) / демо 2 .

Если вы хотите оптимизировать его дальше, вы можете изучить принцип развертывания цикла , который приводит к

\d+\s+-(?:\s+\S*(?:\s(?!\s*-)\S*)*|.+)

См. [1131 ] это демо-выражение (наименьшее количество шагов).

Здесь \S*(?:\s(?!\s*-)\S*)* является эквивалентом (почти) для .*?(?=\s+-|$), но более эффективно, поскольку фрагменты до пробела сопоставляются в «пакетах», проверки на дефис выполняются только при обнаружении пробела . [тысяча сто пятьдесят пять]

Подробности

  • \d+ - 1+ цифр
  • \s+ - 1+ пробелов
  • - - a дефис
  • .*?(?=\s+-|$) - любые 0+ символов, как можно меньше, вплоть до первого появления 1+ пробелов и - или до конца строки.
  • (?:\s.*?(?=\s+-)|.+) - группа без захвата:
    • \s.*?(?=\s+-) - пробелы, 0+ символов, как можно меньше, до 1+ пробелов и -
    • | ] - или
    • .+ - остальная часть строки.
  • \S*(?:\s(?!\s*-)\S*)*:
    • \S* - 0+ непробельных символов
    • (?:\s(?!\s*-)\S*)* - 0 или более повторений
      • \s - пробел li>
      • (?!\s*-) - не сопровождается 0+ пробелами и - li>
      • \S* - 0+ непробельных символов li> ul>

5
задан Albireo 14 September 2012 в 09:58
поделиться

2 ответа

Это могло быть ошибкой под IIS 7.

Я не мог добраться Request.ServerVariables("URL") и Request.ServerVariables("SCRIPT_NAME") возвращать различные значения. Я рассмотрел дела, где их назвали из включенного файла (<!--#include file="file.asp"-->) или после a Server.Transfer.

3
ответ дан 13 December 2019 в 19:36
поделиться

Это, возможно, там в случае Сервера. Передача?

В случае, где Вы делаете server.transfer, я думаю, что Вы получили бы различные результаты

т.е. SCRIPT_NAME был бы, например, /path/to.transferredfile.asp, тогда как URL останется как /path/to/file.asp

1
ответ дан 13 December 2019 в 19:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: