В шаблоне .NET Regex
какие специальные символы нужно экранировать, чтобы их можно было использовать буквально?
Какие символы нужно избегать в .NET Regex?
Ответ 1
Я не знаю полного набора символов, но я все равно не полагался бы на знание, и я бы не ввел его в код. Вместо этого я бы использовал Regex.Escape
всякий раз, когда мне нужен какой-то литерал, о котором я не был уверен:
// Don't actually do this to check containment... it just a little example.
public bool RegexContains(string haystack, string needle)
{
Regex regex = new Regex("^.*" + Regex.Escape(needle) + ".*$");
return regex.IsMatch(haystack);
}
Ответ 2
Вот список символов, которые нужно экранировать, чтобы использовать их как обычные литералы:
- Открытие квадратного скобки
[
- Обратная косая черта
\
- Caret
^
- Знак доллара
$
- Период или точка
.
- Вертикальная полоса или символ трубы
|
- Вопросительный знак
?
- Звездочка или звезда
*
- Плюс знак
+
- Открытие круглого кронштейна
(
и закрывающего круглого кронштейна)
- Открытие фигурного скобки
{
- Знак Pound/Hash
#
Эти специальные символы часто называют "метасимволами".
Но я согласен с тем, что Jon использовал Regex.Escape
вместо жесткого кодирования этих символов в коде.
Ответ 3
Я думаю, вы можете получить список символов как
List<char> chars = Enumerable.Range(0,65535)
.Where(i=>((char)i).ToString()!=Regex.Escape(((char)i).ToString()))
.Select(i=>(char)i)
.ToList();
-
\t\n\f\r#$()*+.?[\^{|
Ответ 4
Смотрите документацию MSDN здесь: http://msdn.microsoft.com/en-us/library/az24scfc.aspx#character_escapes
Проблема с полным списком заключается в том, что это зависит от контекста. Например, .
должен быть экранирован, если он не заключен в скобки, как в [.]
. ]
технически не требуется экранировать, если ему не предшествует [
. -
не имеет особого значения, если он не находится внутри скобок, как в [A-Z]
. =
не имеет специального значения, если ему предшествует ?
, как в (?=)
.