Разбор "\ ENABLED" - Нераспознанная escape-последовательность \ E - PullRequest
1 голос
/ 26 марта 2019
string line = "ena";    

// pattern == "\\ENABLED"; pattern is input by user (see comments below)
string pattern = Console.ReadLine();

foreach (Match match in Regex.Matches(line, pattern,RegexOptions.CultureInvariant))
{
    Console.WriteLine("match");
} 

В приведенном выше примере Regex.Matches() класс дает исключение синтаксический анализ "\ENABLED" -

нераспознанная escape-последовательность \ E.

1 Ответ

1 голос
/ 26 марта 2019

Непосредственная причина исключения состоит в том, что регулярные выражения , а также C # обрабатывают обратную косую черту (\) как специальный символ , например в

  \bABC\p{L} 

шаблон оба \ имеют особое значение. Таким образом, вы должны сбежать \ дважды (для C # и для регулярных выражений):

  const string pattern = "\\\\ENABLED";

или (чтобы сделать pattern более читабельным) вы можете превратить строку в дословную:

  const string pattern = @"\\ENABLED";

Если пользователь (см. Комментарии к вопросу), который предоставляет шаблон, мы должны быть готовыми , чтобы получить синтаксически неправильный один; мы можем попробовать поймать исключение (я):

  Regex regex = null; 

  while (true) { 
    Console.WriteLine("Please, provide the pattern: ");

    try {
      // Try to get pattern from user
      // Trim() - let's be nice and remove leading / trailing spaces
      // TimeSpan.FromSeconds(10) - user can provide a very bad pattern,
      // we don't want to freeze forever (10 seconds at most)
      regex = new Regex(
        Console.ReadLine().Trim(),
        RegexOptions.CultureInvariant,
        TimeSpan.FromSeconds(10));

      // if pattern is syntactically valid
      break;
    }
    catch (ArgumentException e) {
      Console.WriteLine($"Pattern is invalid: {e.Message}");
    }  
  }

  // We have a valid Regex regex based on user pattern; let's use it:

  try {
    foreach (Match match in regex.Matches(line)) {
      Console.WriteLine("match");
    } 
  }
  catch (RegexMatchTimeoutException) {
    //TODO: pattern is bad one, let user know it
  }

Та же идея, если pattern указано в TextBox:

  Regex regex = null; 

  try {
    regex = new Regex(
      patternTextBox.Text.Trim(), 
      RegexOptions.CultureInvariant,
      TimeSpan.FromSeconds(10));
  }
  catch (ArgumentException e) {
    if (patternTextBox.CanFocus)
      patternTextBox.Focus();

    MessageBox.Show($"Incorrect pattern: {e.Message}");

    return;
  } 

  try {
    foreach (Match match in regex.Matches(line)) {
      ...
    }
  }
  catch (RegexMatchTimeoutException) {
    //TODO: pattern is bad one, let user know it
  } 
...