Понятие, что regex не поддерживает инверсию, соответствующую, не совсем верно. Можно подражать этому поведению при помощи отрицательного взгляда-arounds:
^((?!hede).)*$
regex выше будет соответствовать любой строке, или строка без разрыва строки, не содержащий (sub) представляет 'Эде' в виде строки. Как упомянуто, это не что-то, что regex "хорош" в (или должен сделать), но тем не менее, это возможно.
И если необходимо соответствовать символам разрыва строки также, используйте эти ТОЧКА - ВЕСЬ модификатор (запаздывание s
в следующем шаблоне):
/^((?!hede).)*$/s
или использование это встраивает:
/(?s)^((?!hede).)*$/
(где эти /.../
regex разделители, т.е. не часть шаблона)
, Если ТОЧКА - ВЕСЬ модификатор не доступен, можно подражать тому же поведению с классом символов [\s\S]
:
/^((?!hede)[\s\S])*$/
строка А является просто списком n
символы. Прежде, и после каждого символа, существует пустая строка. Так список n
символы будут иметь n+1
пустые строки. Рассмотрите строку "ABhedeCD"
:
┌──┬───┬──┬───┬──┬───┬──┬───┬──┬───┬──┬───┬──┬───┬──┬───┬──┐
S = │e1│ A │e2│ B │e3│ h │e4│ e │e5│ d │e6│ e │e7│ C │e8│ D │e9│
└──┴───┴──┴───┴──┴───┴──┴───┴──┴───┴──┴───┴──┴───┴──┴───┴──┘
index 0 1 2 3 4 5 6 7
, где эти e
пустые строки. regex (?!hede).
смотрит вперед, чтобы видеть, нет ли никакой подстроки "hede"
, чтобы быть замеченной, и если это так (таким образом, что-то еще замечено), затем эти .
(точка) будет соответствовать любому символу кроме разрыва строки. Взгляд-arounds также называют утверждения нулевой ширины , потому что они не делают , используют любые символы. Они только утверждают/проверяют что-то.
Так, в моем примере, каждая пустая строка сначала проверена, чтобы видеть, нет ли никакого "hede"
вперед, прежде чем символ будет использован эти .
(точка). regex (?!hede).
сделает это только однажды, таким образом, он будет перенесен в группу и повторил нуль или больше раз: ((?!hede).)*
. Наконец, запуск - и конец входа привязывается, чтобы удостовериться, что весь вход используется: ^((?!hede).)*$
, Как Вы видите, вход "ABhedeCD"
перестанет работать, потому что на [1 122], сбои regex (?!hede)
(там "hede"
вперед!).
Сопоставления mime-типов .NET хранятся в классе System.Web.MimeMapping
, который предлагает метод GetMimeMapping .
До. NET 4.5 этот класс был помечен как внутренний
и поэтому недоступен для вашего кода. В этом случае лучшее, что вы можете сделать, это украсть список, который вы можете получить с помощью Reflector, и декомпилировать статический конструктор (cctor).
Если вы воспользуетесь этим подходом, вам может быть лучше просто создать список поддерживаемых расширений и их тип пантомимы и сохранение его в словаре. (Список внутри MimeMapping немного подробен)
Эта информация находится в реестре в HKEY_CLASSES_ROOT \
using(var key = Registry.ClassesRoot.OpenSubKey(".htm"))
{
string mimeType = key.GetValue("Content Type") as string;
}
Если я правильно понимаю ваш вопрос, вы обслуживаете статические файлы и хотите иметь возможность обрабатывать запрос статического файла, чтобы решить, есть ли у пользователя доступ к этому файлу. (на основе типа MIME)
Если вы сопоставите все запросы файлов с помощью настраиваемого IHttpHandler (см. раздел обработчиков вашего файла web.config), вы сможете это сделать.
In ProcessRequest (или BeginProcessRequest, если вы реализовать асинхронный обработчик), вы можете вызвать HttpContext.Current.Server.MapPath ("~" + HttpContext.Current.Request.Path) (может быть лучшим способом сделать это), чтобы получить текущий запрашиваемый статический файл.
Затем вы можете проанализировать расширение этого файла, чтобы принять решение.
Несколько месяцев назад у меня была похожая проблема, и я решил ее с помощью этого простого класса-оболочки вокруг System.Web.MimeMapping (как упомянул Ричард Салай):
/// <summary>
/// This class allows access to the internal MimeMapping-Class in System.Web
/// </summary>
class MimeMappingWrapper
{
static MethodInfo getMimeMappingMethod;
static MimeMappingWrapper() {
// dirty trick - Assembly.LoadWIthPartialName has been deprecated
Assembly ass = Assembly.LoadWithPartialName("System.Web");
Type t = ass.GetType("System.Web.MimeMapping");
getMimeMappingMethod = t.GetMethod("GetMimeMapping", BindingFlags.Static | BindingFlags.NonPublic);
}
/// <summary>
/// Returns a MIME type depending on the passed files extension
/// </summary>
/// <param name="fileName">File to get a MIME type for</param>
/// <returns>MIME type according to the files extension</returns>
public static string GetMimeMapping(string fileName) {
return (string)getMimeMappingMethod.Invoke(null, new[] { fileName });
}
}