解析“\ ENABLED” - 无法识别的转义序列\ E.

问题描述 投票:1回答:1
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" -

无法识别的转义序列\ E.

c# regex backslash
1个回答
1
投票

异常的直接原因是正则表达式以及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
  } 
© www.soinside.com 2019 - 2024. All rights reserved.