В шаблоне .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]. = не имеет специального значения, если ему предшествует ?, как в (?=).