Подтвердить что ты не робот

Какие символы нужно избегать в .NET Regex?

В шаблоне .NET Regex какие специальные символы нужно экранировать, чтобы их можно было использовать буквально?

4b9b3361

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