C# 解析\启用";-无法识别的转义序列\E

C# 解析\启用";-无法识别的转义序列\E,c#,regex,backslash,C#,Regex,Backslash,在上面的示例中,Regex.Matches()class给出异常解析“\ENABLED”- 无法识别的转义序列\E 异常的直接原因是正则表达式和C将反斜杠(\)视为特殊符号,例如在 string line = "ena"; // pattern == "\\ENABLED"; pattern is input by user (see comments below) string pattern = Console.ReadLine(); foreach (Match match i

在上面的示例中,
Regex.Matches()
class给出异常解析
“\ENABLED”
-

无法识别的转义序列\E

异常的直接原因是正则表达式和C将反斜杠(
\
)视为特殊符号,例如在

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");
} 
两种模式
\
都有特殊的含义。因此,您必须转义
\
两次(对于C#和regex):

或者(为了使
模式
更具可读性),您可以将字符串转换为逐字:

  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
  }

“\\\\ENABLED”对于C#和Regex,必须逃逸两次。或者你可以把
@“\\ENABLED”
模式,即“\\ENABLED”由用户以文本框的形式输入,因此如何在文本框中处理如果
模式
是由用户输入的,它很可能是语法错误的,我们应该准备好这一点:我们必须添加异常捕获,并让用户知道
模式
是错误的。
  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
  }
  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
  }