Я знаю, что это и старая тема, но вот мое очень простое решение:
string s = Regex.Escape («pattern - escaped for sanity»). Заменить («%») , ". *"). Заменить ("_", ".?"); user = & gt; Regex.IsMatch (user.FullName, s, RegexOptions.CultureInvariant | RegexOptions.IgnoreCase);
В этом коде я использую общие escape-символы для языка SQL. Если вы хотите использовать say *
и ?
, escaped string будет содержать \ *
и \?
соответственно, make обязательно включите символ обратного слэша в операторе .Replace (...)
. Конечно, если вы хотите дать своему пользователю возможность искать RexEx, просто не избегайте строки шаблона.
Поиск в учебнике Regex для других опций.
Я считаю, что обычно %
будет соответствовать хотя бы одному символу , а RegEx . *
будет соответствовать ноль или более символов . Таким образом, в действительности подстановочный символ %
больше похож на . +
(жадный), а не . *
(ленивый).
Надеюсь, это поможет.
Не совсем. Но игнорировать cv -qualifications на void или делать их ошибки могли бы создать ненужную сложность с точки зрения как реализации компилятора, так и кода конечного пользователя. Рассмотрим шаблоны типа
template & lt; typename T & gt; const ... ...
Нет причин использовать с помощью void в этом сценарии особый случай (больше, чем он есть), он просто создаст головные боли.
Кроме того, в то время как const void
не помогает, const void *
имеет свои применения.
const void
разрешен просто потому, что нет смысла заставить компилятор выгнать это одно исключение из общего правила, и ему не вредно оставить его.
Там есть некоторое обсуждение выше, что const void *
не очень полезно:
Насколько полезен const void *? Я вижу, как может быть void * const, но не первый. -Spidey
blockquote>На самом деле
const void *
иногда является существенным. Он заявляет, что указываемая вещь читается только в отличие отvoid * const
, которая только объявляет, что сам указатель является постоянным, но не тем, на что он указывает.Из моего опыт, указатель на константу с использованием
const void *
является более полезным из двух форм. Конечно, существует такжеconst void * const
, что означает, что и указатель, и то, что он указывает, являются постоянными.
void *
обычно используется как способ передачи неспецифических указателей (например, с помощьюmemcpy ()
). Если вы хотите передатьconst char *
в такую функцию, вы не сможете использоватьvoid *
или потеряете тот факт, что предмет, на который он указывает, является постоянным и не может быть изменен , Текущие компиляторы C ++ откажутся от компиляции, так как это должно было бы неявно отброситьconst
и по праву, так как эти данные могут находиться в постоянной памяти и, возможно, вызывать исключение, если что-либо пытается написать это.Вот почему второй аргумент
memcpy ()
-const void *
, а не простоvoid *
.
void *
land.string read_name (enum dynamic_type, const void *)
. Это не супер полезно, нет, но больше, чемconst void
. И, конечно,void * const
полезна, но на самом деле это не вопрос. – Logan Capaldo 20 March 2012 в 16:01T *
) вvoid *
(и обратно позже), тогдаconst void *
является эквивалентомconst
(поэтому для некоторогоconst T *
). Конечно, вы могли быconst_cast
, но почему? Другими словами, он столь же полезен, как и любой другойconst T *
, и это «довольно много». :) – Lightness Races in Orbit 9 August 2018 в 15:43